The answer here depends on the business requirements - for example, if we are unable to cancel one of the shipments, does that mean that we should roll back the cancellation of the order?
My sense is that the answer is probably no. As such, the message-driven model you've used seems more appropriate than doing everything synchronously in a single handler.
One minor issue I have with your code is that you're publishing commands in your OrderCancelledHandler. You should probably Bus.Send them instead.
Also, by doing a single Bus.Publish/Bus.Send, you are indicating that the processing of the complete set of commands should be one transaction. I don't think you want that. Instead, I'd suggest looping over the commands and doing a Bus.Send for each one separately.