Я написал такую тему.
Реализовано в виде миддвера, код выкладывать не буду, так как сам я - чайник, и в меня полетят тухлые овощи за быдлокод, но суть такая:
Миддлвер подключается перед обработчиком ошибок - концом цепочки миддверов и после миддвера, который отвечает за отдачу статики.
Миддлвер проверяет запрос, если он - изображение, то методом fs.stat() считывается статистика файла-заглушки, время последней модификации записывается в заголовок Last-Modified. Если получен заголовок If-Modified-Since он сравнивается с временем последней модификации, если время заголовка меньше - отдаем пустой ответ со статусом 304 и необходимыми заголовками.
Если меньше - то методом fs.pipe пользователю отдается файл со статусом 200 и заголовком Last-Modified, что бы он мог в следующий раз передать нужный заголовок, что бы мы просто вернули 304.
Если заглушка мелкая - то можно чудесно обойтись и без fs.pipe.
Еще можно проставлять тег в заголовке If-None-Match и ловить его в заголовке E-tag, опять же, отдавать 304 если не изменился, но у меня механизм запроса из кеша заработал и без него. Время запроса изображения увеличилось с 5-8 до 7-10 мс на express 3, так что, думаю, можно и обойтись без установки дополнительного веб сервера только для отдачи таких вот прелестей)