Что он делает?
Он создает цепочку обработки списка сущностей с помощью операторов, которые принимают каждую сущность по отдельности. Результат потом агрегируется в новый список.
Зачем это надо?
Вместо того, чтобы реализовывать обработку батчами в операторах, можно использовать этот оператор.
Примеры
of([1, 2, 3]).pipe(forEach(map(i => i + 1))); // [ 2, 3, 4 ]
files.pipe(forEach(upload(uploader))); // каждый файл будет загружен по отдельности, и результат сформирован в один большой список