Se o arquivo2 couber na memória, você poderá usar o awk. Faça com que ele seja lido no arquivo2 primeiro e, em seguida, quando estiver processando o arquivo1, se ele vir "X", substitua-o da matriz do arquivo2:
$ awk 'NR == FNR { lines[NR]=$0; } NR != FNR { if ($0 == "X") print lines[FNR]; else print $0 }' file2 file1
Re-formatado, isso é:
$ awk 'NR == FNR { lines[NR]=$0; }
NR != FNR { if ($0 == "X") print lines[FNR];
else print $0
}' file2 file1
Observe que o arquivo2 é o primeiro nome de arquivo; file1 é o segundo nome de arquivo.