I think it's perfectly fine do create multiple message loops on different threads. The only thing to watch out for is when dealing with 3rd party UI toolkits, they sometimes store handles as static (instead of ThreadStatic) members and if you have multiple UI threads in your application, it will have problems (in my case, I found that the menu / toolbar keyboard accelerators did not work properly).
One of the big reasons for doing this is if you have modal dialogs that show up on the different modeless dialogs. If you put everything on the same message loop, then if one of the modeless dialogs has a modal dialog, the whole application (all the windows) are blocked until you dismiss the modal dialog.
And, like Kevin was saying, watch out for cross-window (cross-thread) calls. You can use Control.BeginInvoke or Control.Invoke to post delegate calls on the other UI threads.
The other thing to consider is how you will be exiting your process. You will most likely need to keep track of the message loops so you can stop them when you want to close everything out. If you don't care and just want the process to end when all the windows are closed, you can do that too.