I hit this problem when were creating the orchestration to periodically poll the outer service. The orchestration was with loop inside.
The problem was I created the message inside this loop. And the instance of this message were not disposed after each cycle. The BizTalk does not have such functionality as explicit deleting the messages inside orchestration.
The orchestration was created for running long time without restart. That means that this orchestration was collecting enormous amount those indisposed messages. And all those messages were inside the MessageBox, of course. It was wrong!
After long and very interesting investigation the issue was resolved.
The source of the problem was in the transactional scope where I created the indisposable message. This scope was inside the loop. The message was recreated on each cycle of the loop.
It is interesting but a lifespan of the message recreated inside the transactional scope included in the loop and the message recreated outside the transactional scope in the loop is different. The first one is disposed only after closing the orchestration instance. The second one is disposed after last using. (I think so but could not find a hint in the BizTalk information sea.)
After discovering this the fix was simple. I moved the transaction scope outside of the loop.