Olá Maurício, tudo bem? 
Você interpretou corretamente o trecho:
temporadas.forEach(t -> t.episodios().forEach(e -> System.out.println(e.titulo())));
- temporadasé uma lista de objetos do tipo Temporada.
- Para cada temporada (t), ele chamat.episodios(), que aparentemente retorna uma lista de episódios.
- Em seguida, faz um forEachnessa lista de episódios, e para cada episódio (e), imprime o título:e.titulo().
 Mas por que isso funciona se titulo não está em Temporada?
Porque titulo() está no objeto Episodio, não em Temporada.
O ponto-chave é que:
- Você não está acessando titulo()diretamente deTemporada, mas sim do retorno det.episodios(), ou seja, da lista deEpisodio.
- A IDE entende que t.episodios()retorna uma coleção deEpisodio, e queEpisodiotem o métodotitulo().
Em resumo:
A IDE (e o compilador) não dá erro porque:
- t.episodios()retorna uma lista de objetos- Episodio.
- Cada Episodiotem o métodotitulo().
- A sintaxe com lambdas está correta.
Se você tentar chamar t.titulo() diretamente, aí sim daria erro, porque titulo() não existe em Temporada.