Allora, la soluzione così al volo non ce l'ho, però posso darti qualche suggerimento:

codice:
  esegui:=true;
Questa variabile "esegui" non ti serve. La usi esattamente per fare quello per cui la proprietà Terminated è preposta.

codice:
procedure TAggiornaStato.Execute;
begin
  updateState;
  while (esegui) do
  begin
    try
      if (Terminated) then
        updateState;
    except
      on e:exception do
      messageDlg('Errore Thread: '+trim(e.message),mtwarning,[mbOk],0);
    end;
    Sleep(4000);
  end;
end;
Il controllo del while fallo sulla proprietà Terminated. Poi non capisco una cosa: pare che questo thread richiami "updateState" all'inizio e quando termina, ma durante l'esecuzione non fa nulla, forse hai solo omesso delle parti non significative. Ovviamente la "updateState" finale la puoi mettere fuori dal ciclo while. Inoltre 4000ms di Sleep mi pare decisamente troppo. A proposito, la updateState è thread-safe vero? O aggiorna l'interfaccia grafica?

codice:
  AGGST.fermaElaborazione
  //attendo il terminate
  repeat
  until AGGST.terminate;
Meglio fare:

AGGST.Terminate();
AGGST.WaitFor();

(e comunque doveva essere AGGST.terminated).