The problem is that system will block until the script completes, which means the join() on the thread will also block. If you can do without the return value, you can detach() the thread instead of join()ing it.
I'm not too sure as to how you can call DoEvents() while waiting for system() to return and also return a value. Someone else may reply to your email with an elegant solution. Otherwise, you could try searching the Win32::GUI Users mail archive here. There are quite a number of posts concerning threads and Win32::GUI; some also have sample code, which you may find useful.