eval
realiza um nível extra de substituição e processamento no restante da linha.
Na primeira iteração do loop, i é definido como "VAR1" e um nível de escape de contrabarra é reduzido, portanto:
eval X=\$$i
torna-se:
X=$VAR1
que é avaliado como:
X=mom
(repetir para o próximo loop, apenas $ i é VAR2 e $ VAR2 = dad)