1. Для Accept у вас лишний поток. Куда лучше сделать подключение новых клиентов через
BeginAcceptTcpClient
2. Дальше тоже лучше использовать асинхронные запросы
var stream = tcpClient.GetStream();
var asyncResult = stream.BeginRead(buffer, 0, READ_BUFFER_SIZE, ReadStreamCallback, null);
, что позволит легко управлять временем жизни клиента.
3. А вот как сами запросы выполнять сильно зависит от архитектуры вашего приложения. Если запросы все быстрые (получил запрос и мгновенно выдан ответ), то можно все обслуживать в одном потоке, а если запросы тяжелые, то чтобы не тормозить с ответом другим клиентам, можно и распаралелить.