Come puoi vedere nel piano di query, con i CTE, il motore si riserva il diritto di applicarli fondamentalmente come ricerca, anche quando desideri unire.
Se non è abbastanza sicuro, può eseguire il tutto in modo indipendente, in anticipo, generando essenzialmente una tabella temporanea ... eseguiamola una volta per ogni riga.
Questo è perfetto per le query di ricorsione che possono fare come per magia.
Ma stai vedendo, nei Nested Loop nidificati, dove può andare terribilmente storto.
Stai già trovando la risposta da solo provando la vera tabella temporanea.