Нашел ошибку. У меня класс widget был сделан потокобезопасным, чтобы в него можно было отправлять сигналы из других потоков. На все вызовы методов и слотов повесил мьютекс. В результате setPlainText вызывает сигнал endEditing.
Так как поток widget-ов один (главный), а сигналы от дочерних widget-ов подключены синхронно, происходит блокировка мьютекса.
Для решения данной проблемы необходимо подключать сигналы ассинхронно с помощью очереди:
connect(vNewText,SIGNAL(textChanged()),this,SLOT(endEditing()),Qt::QueuedConnection);
проблема решена.