Direi che sono stati forniti già ottimi suggerimenti, quindi aggiungo solo un paio di considerazioni al problema.

La protezione del codice nella critical section va fatta usando try...finally:

codice:
EnterCriticalSection(TCSLog);
try
	...
	...
finally
  LeaveCriticalSection(TCSLog);
end;
Questo garantisce che l'oggetto venga rilasciato anche in caso di errori, impedendo un "deadlock" dell'applicazione.

In merito al problema specifico, credo che ci sia da indagare maggiormente sulle operazioni svolte dal programma per saperne di più: il ritardo potrebbe essere dovuto a qualcosa che non è strettamente legato al multithreading.

Ciao!