Описание довольно общее дано у Вас.
Со стороны сервера:
1) Обработка данных занимает малое время и ответ ожидается в том же соединении? Если результурующий файл находится в памяти процесса, то тут проще некуда - записать данные в качестве ответа, выставив нужные заголовки ( Content-Type, Content-Length, Content-Disposition, если требуется). Если на диске, то либо читаем и делаем как в предыдущем предложении, либо отправляем ссылку на файл и следующим запросом с клиента его скачиваем. Также, если есть nginx перед нодой (другие веб-серверы тоже такое поддерживают), то можно воспользоваться штукой под названием
X-Sendfile (чтобы не грузить ноду для отдачи контента с диска).
2) Если обработка занимает долгое время, то обычно клеинту сразу отвечают с каким-нибудь уникальным идентификатором запроса, по которому он периодически проверяет готовность (если нет других каналов для эффективной обратной связи) и получает ссылку на скачивание (которая далее обрабатывается либо nginx, либо тем же express-static).
Со стороны клиента:
1) Если запрос идёт через XHR, то, на сколько я помню, нужно использовать некоторые костыли, чтобы браузер показал клиенту диалог сохранения файла (гугл в помощь тут).
2) Если стандартная отправка формы и сервер сразу отвечает файлом, то тут вообще ничего делать не надо (возможно потребуется заголовок Content-Disposition, иначе браузер может отобразить файл, если он умеет читать такой формат сам, плюс чтобы задать адекватное имя файлу).