Проблема оказалась в использовании QThread::usleep внутри потока.
Я приостанавливал второй поток для того, чтобы дать возможность главному отрисовать форму и обновить прогресс операции.
Видимо это была не самая лучшая идея, хотя всё работало хорошо в не свёрнутом приложении. Это же и объясняет малое потребление процесорного времени.
В документации QT сказано:
Instead of the sleep() functions, consider using QTimer.
Буду использовать его.
Осталось понять, что же происходит при использовании QThread::usleep.