Primeiramente,
insert into mutate (x, y)
select x + 1, y + 1
from mutate;
Não inicia um loop infinito, pois a consulta não verá os dados que foram inseridos - apenas os dados que existiam no início da instrução. As novas linhas só serão visíveis para as instruções subsequentes.
Isso explica muito bem: