Acho que compreendi, as expressões lambdas intermediárias só são executadas quando uma expressão terminal é localizada, é isso? Portanto, quando forEach é localizado pelo compilador, ele retorna e faz o filter?
Mas não tem nenhum motivo para isso acontecer certo? Simplesmente foi desenvolvido dessa maneira?
Lazy significa que a coleção só é realizada quando necessário ou quando encontra um comando terminal. A principio não tem nada a ver com lambdas. Um exemplo seria trabalhar com o conceito de coleções infinitas, algo impossível com uma coleção normal (gulosa).