Sagt wer?
Naja, vielleicht nicht ganz, aber es heißt hier u.A.: "Seit der JavaScript-Version 1.5 gilt das Auslesen der Treffer geklammerten Ausdrücke über RegExp.$1, RegExp.$2 und so weiter als veraltet."
Das wird die Probleme 2 und 3 nicht lösen.
Wieso nicht? Es macht genau das was gefordert war: Es durchläuft das Array a mit den Ersetzungswerten und ersetzt im String s alle Vorkommen von a+Arrayindex (also a0 bis a99, wenn a entsprechend lang ist) durch den entsprechenden Ersetzungswert. Probier's doch aus:
var a = ['a','b','c','d','e'];
var s = "-a0-a1-a2-a3-a4-a2-";
for(x = 0; x < a.length; x++){
s = s.replace( new RegExp("a"+x,"g"), a[x] );
}