No entiendo demasiado de hilos pero siento que tu código está muy enredado.
¿Para qué pones al WaitForSingleObject dentro de un while? En principio, no se pasará de esa línea hasta que no se cumpla el tiempo especificado y si no quieres que termine después de ese tiempo pones INFINITE como timeout y sólo terminará hasta que se cumpla la condición (que termine la otra aplicación)
Y así mismo, no entiendo para qué usas un repeat en el método execute. Si el WaitForSingleObject esta en INFINITE, el método Execute no terminará hasta que no acabe la otra aplicación.
Por otra parte no estoy seguro de si realmente es necesario usar un thread aparte. Cuando uses la balanza podrías poner algo como:
Código Delphi
[-]
EjecutarBalanza;
DeleteFile('archivo.txt');
repeat
Application.ProcessMessages;
until FileExists('balanza.txt') or Application.Terminated;
ShowMessage('Ya terminó');
// Saludos