tu ja observevou se a aplicação realmente não fecha ou somente a seção que não fecha?
tive o mesmo problema aq mas não era a aplicação que trancava e sim os outros processos(ctfmon e userinit) que iniciam junto do sistema dai coloque na saida da aplicação isso:
var H:AnsiString;
begin
//finaliza o ctfmon para o logout mais rapido da seção remota.
h:= 'TASKKILL /F /FI "USERNAME eq '+winlogin+'" /IM ctfmon.exe ';
WinExec(PAnsiChar(h),SW_SHOW);
h:= 'TASKKILL /F /FI "USERNAME eq '+winlogin+'" /IM userinit.exe ';
WinExec(PAnsiChar(h),SW_SHOW);
end;
function WinLogin: String;
//
// Retorna o Usuario que está logado na rede
//
// Esta função requer a unit DBitypes na clausula Uses da unit
//
var
dwUserNameLen : DWord;
FUserName: String;
begin
dwUserNameLen := dbiMaxUserNameLen + 1; //DBiTypes
SetLength(FUserName, dwUserNameLen);
if GetUserName(PChar(FUserName), dwUserNameLen) then //AdvApi32.Dll
SetLength(FUserName, dwUserNameLen-1)
else SetLength(FUserName, 0);
Result := FUserName;
end;