Fácil pode ser feito com awk
awk '
/^!!/{ #for line stared with '!!'
getline <"file2.txt" #read 1 line from outer file into $0
}
1 #alias for 'print $0'
' file1.txt
Outra versão
awk '
NR == FNR{ #for lines in first file
S[NR] = $0 #put line in array 'S' with row number as index
next #starts script from the beginning
}
/^!!/{ #for line stared with '!!'
$0=S[++count] #replace line by corresponded array element
}
1 #alias for 'print $0'
' file2.txt file1.txt