Я думаю, что это прекрасно, создайте несколько циклов сообщений в разных потоках. Единственное, на что следует обратить внимание, это когда речь идет о сторонних инструментальных средствах пользовательского интерфейса, они иногда хранят дескрипторы как статические (а не ThreadStatic) члены, и если у вас в приложении несколько потоков пользовательского интерфейса, у него будут проблемы (в моем случае я обнаружил, что что меню / панель инструментов ускорители клавиатуры не работали должным образом).
Одна из главных причин для этого - наличие модальных диалоговых окон, которые отображаются в различных немодальных диалоговых окнах. Если вы поместите все в один и тот же цикл сообщений, то, если в одном из немодальных диалогов есть модальное диалоговое окно, все приложение (все окна) будут заблокированы, пока вы не закроете модальное диалоговое окно.
И, как говорил Кевин, остерегайтесь вызовов между окнами (между потоками). Вы можете использовать Control.BeginInvoke или Control.Invoke для публикации вызовов делегатов в других потоках пользовательского интерфейса.
Другая вещь, которую стоит рассмотреть, - это как вы будете выходить из процесса. Скорее всего, вам нужно будет отслеживать циклы сообщений, чтобы вы могли их остановить, когда захотите закрыть все. Если вам все равно и вы хотите, чтобы процесс завершился, когда все окна закрыты, вы тоже можете это сделать.