Просто оборачивание тяжелой операции в setImmediate большого профита не даст, Вы все равно блокируете поток на время ее выполнения.
А вот разбить ее на небольшие быстрые части с помощью setImmediate можно, сам midleware будет отрабатывать чуть медленнее, зато EventLoop будет отрабатывать.
В большинстве случаев адекватно прерывать задачу на обработку EventLoop каждые 1000 итераций цикла, хотя конкретное число итераций зависит от вычислительной сложности тела цикла в Вашем случае.