あれ?でもさ、

pattern='+'
$ echo "$pattern" | sed "s/$(echo "${pattern}" | sed -r 's/([-*+^.$/\]|\[|\])/\\\1/g')/foo[2]/g"
foo[2]

入力が '+' でパターン文字列も '+' だから foo[2] に置換されるのは正しいんじゃないかな?

でもまぁ、GNU sed で -r オプション付けると `+` 記号がメタキャラクタになるから、付けない場合は
`+` を考慮する必要はなかったのね…

$ echo "$pattern" | sed "s/$(echo "${pattern}" | sed -r 's/([-*^.$/\]|\[|\])/\\\1/g')/foo[2]/g"

こっちの方が良いみたい。