The dead letter queue is used when there is no application to give a return code to.
In your first example, the AMQSPUT application was given a reason code, MQRC_Q_FULL (2053) so there is no requirement for the DLQ.
In your second example, the application that put the message to the remote has been given a zero return code at the point where the message lands on the transmission (Xmit) queue but then something happens downstream that fails. In this case, the zero return code means that MQ has already promised to look after this message, so it has to find somewhere safe to store it and in doing so also record the reason it failed. This is why it uses the DLQ.
You can read this blog post I wrote for more information: Dead-letter Queue use by IBM MQ Channels
There are other components in MQ that will use the DLQ, but the main point is that if there is an application to give a reason code back to then they don't need to.
Cheers,
Morag