Это нормальное поведение данного метода
Ускорить процесс можно предварительно вызвав метод 
terminate но следует понимать что данный вариант не снимает блокировки если таковые были и если есть работа в БД то может произойти что-нибудь непредвиденное 
Есть другой вариант а именно отказаться вообще от метода 
wait а использовать сигналы с дополнительной проверкой 
Например в thread можно переопределить сигнал 
finished и возвращать 
id потока в управляющий код с последующим удалением потока из, например, словаря.
1. При создании потока в управляющем коде заносим данные о потоке в словарь 
self.threads["thread_{}".format(i)] = thread
2. Для создаваемых потоков регистрируем событие 
finished 
thread.on_finished.connect(self.on_finished)
3. В потоке переопределяем событие 
finished
self.finished.connect(self.on_finished)
4. При завершении потока генерим сигнал и передаем в управляющий код id потока
self.on_finished.emit(self.thread_id)
5. При срабатывании сигнала 
finished в управляющем коде удаляем поток из словаря 
self.threads
self.threads.pop("thread_{}".format(thread_id))
6. Ну а теперь ждем завершения потоков не через 
wait() а как-то так 
while self.threads:
    QtWidgets.qApp.processEvents()
Сам использую этот механизм при визуализации работы потоков 
