Can message become poisoned if it's non-transactional?
The documentation seems to imply not, but I'm not finding a direct statement one way or the other.
Yes, it's possible, in some circumstances.
Poison message is a message which stays on top of a queue, preventing others to come through. Now, what makes transactional messages to go poisoned? It's when we roll back transaction and message goes back where it was before, right on the top of the queue. So it's not something about message itself (at least not directly), but a consequence of how we process messages and what we do when that processing fails, i.e. perform a rollback.
If queue is non-transactional, and we "Receive" message from the top of the queue it's irreversible. There's no rollback which would put message back on that top position. If we want to put that message back to queue to be retried later, all we can do is send a copy of original message. And MSMQ Send puts it at the end of the queue. So it can't block other messages.
There is one case when this doesn't apply, and that's if we play with message priority and send it back with higher priority than the rest of the queue. That would put it back on the top and create poison message scenario.
Another way is if our processing consists of "Peek" (which doesn't remove message), followed by "Receive" if processing is ok. If processing fails between Peek and Receive, message would stay on the top of the queue.
So, yes, it's possible to have poison messages with non-transactional messages, but only if do things in specific way.