O caractere & em $varj tem um significado especial na parte de substituição de um comando s/search/replace/ . Isso significa "insira o texto correspondente aqui".
Você pode usar \& para "escapar" de & , para que não tenha um significado especial. Você pode usar sed para modificar $varj para substituir todos os & chars por \& :
varj=$(echo "$varj" | sed -e 's/\&/\\&/g')
Por exemplo:
cas@ganesh:/tmp$ ksh
$ vari='111|abc & efg|123'
$ varj='222|abc & efg|123'
$ echo "$vari" | sed -e "s/$vari/$varj/g"
222|abc 111|abc & efg|123 efg|123
$ varj=$(echo "$varj" | sed -e 's/\&/\\&/g')
$ echo "$varj"
222|abc \& efg|123
$ echo "$vari" | sed -e "s/$vari/$varj/g"
222|abc & efg|123