Использовать активные объекты подобным образом - как минимум признак дурного тона, заодно источник трудноуловимых ошибок как в вашем случае.
Позволю себе несколько подправить приведенный выше код, попробуйте - вдруг поможет:

Code:
TRequestStatus timerstatus;
RTimer timer;
timer.CreateLocal();
timer.After(timerstatus, KRetryInterval);

TRequestStatus status;	
sock.Send(iBuffer,0,status);
User::WaitForRequest(status, timerstatus);
if (timerstatus != KRequestPending)
{
   // сработал таймер - произошел таймаут
   sock.CancelSend(); // отменяем посылку
   User::WaitForRequest( status ); // нужно дождаться отмены 
} else 
{
   // завершился Send
   timer.Cancel(); // отменяем ожидание по таймеру
   User::WaitForRequest( timerstatus ); // нужно дождаться отмены 
}
timer.Close()