O caso é semelhante a este: Anexando uma string contendo escapar personagem com sed
Sugiro a mesma resposta (adaptada):
for file in "${filelist[@]}"; do
sed -i "1i\
$(echo -E "$prefix" | sed -e 's/\/\\/g' | sed -e '$! s/$/\/')" "$file" &&
echo "$suffix" >> "$file"
done
O sed command i requer que cada linha, exceto a última, seja finalizada com uma barra invertida (isso estava faltando na resposta referida). Além disso, as barras invertidas precisam ser dobradas, portanto, sed não tentará interpretá-las. O echo produz o conteúdo da variável $prefix . Em seguida, no pipeline, o comando sed duplica as barras invertidas. O segundo comando sed adiciona barras invertidas no final de cada linha, exceto a última.
EDITAR Como funciona o programa sed $! s/$/\/ :
Primeiro, o endereço $ significa executar o comando que segue na última linha. $! nega isso, então o comando será executado em todas as linhas, exceto na última.
Em seguida, o comando s/// faz substituição. Ele substituirá a string vazia no final da linha, denotada por $ , por uma barra invertida. Mas a barra invertida é um caractere especial, por isso precisamos escapar dela com outra barra invertida para que sed a leia corretamente.