In general your approach is correct. You are correctly using .WaitBrowser() to check if the given browser process is running.
The case is that quite often I've seen that IE does not always closes its process and this causes TestComplete to stuck until IE process is closed. So in case of IE you may choose not to check whether IE is running or not, but terminate all running instances of IE and start it anew.
So instead of using the GUI it's best to write underlying code to achieve proper closure of browser instances? The behaviour is very intermittent when using the GUI functions. Sometimes it will open a browser window, sometimes it won't.
> So instead of using the GUI it's best to write underlying code to achieve proper closure of browser instances?
You may try to close browser using GUI, wait for some time (depending on your tested application) for the browser process to not exists and terminate the process if it did not end within the timeout (with or without warning posted to test log, which is up to you).
It is my understanding that the behaviour depends on the tested application, as I had a web application that quite often caused IE process to stay in memory while everything was fine with other browsers (FF, Chrome, Edge).
P.S. And check that you have set up IE according to the recommendations from TC help (especially - to disable it running in the background).