Если сервер реализует свой обмен данными поверх "чистого" tcp - то вообще непонятно, зачем весь сыр-бор с нитями, чтобы ожидать ответа от sql сервера? Уж увольте, лучше было бы сделать обычный диспетчер очереди запросов к БД, а нити "сэмулировать" в асинхронном режиме, не замучивая менеджер памяти потокобезопасными методами.
Не забывайте - ObjectPascal-подобные системы (в том числе C#

) поддерживают динамические массивы записей произвольной структуры и объема. Вам, фактически, не нужен стек под каждую "нить", просто добавляйте в динамический массив еще одну запись при подключении пользователя. А дальше стройте все на обработке TServerSocket-событий.