@avra, thanks for the reply. I ended up solving the problem by inserting a Sleep(100) after each output reading function. This way, I could test for TAsyncProcess.Running flag.
if I do not give it a short break, after the available bytes are all read and the program terminates, the Running flag may not be updated soon enough.