То есть, если одно приложение заняло сокет сервера долгой операцией по передаче данных, другие сокеты будут простаивать и ждать пока эта операция не завершиться.


Да действитеьно, пока сокет читает данные, другой ждет его завершения. Как запихнуть сокет в свой поток? В примере ThreadFortuneServer сокет создается в потоке, отвечает и сразу закрывает соединение, как продолжить работу, я не соображу :(.

UPD: нужно всего-навсего в конце метода run указать this->exec(); и, конечно-же, при закрытии сокета финишировать поток.