I did not us _beginthreadEX() because I did not see a purpose for the extra params (except to disallow multiple help windows, but I am not yet worried about that)
Well, whether it's efficient or not may not matter. It's simply easier to use threads when you want two things executed at the same time.
But in reality, is MessageBoxA a blocking function? In a GUI where efficiency may not be #1, it probably doesn't matter whether it's multi-threaded or not. If it simplifies the code then sure. I've experienced developers throw up a thread pool and then toss all functions onto the thread pool and let whatever thread handling system they have implemented choose which thread to use the given function on. This can be efficient with computers with more than one core apparently. std::bind and Boost.Bind also simplify this task greatly. However, thread safety comes to mind when doing such a method and the complicated workarounds needed.