No le veo mucho problema a usar una variable global para ese caso, pero bueno, te comento. Si defines la variable dentro de una función, obiamente cada vez que llames a la función resetearás la variable, en este caso perdiendo los valores acumulados.
Si no quieres usar una variable global, necesitas alguna forma de que la función recuerde el valor de la variable entre llamada y llamada, y la alternativa es hacerlo con una clase, y declarando la variable como una propiedad de la clase.
Para tu ejemplo, voy a hacer una clase Acumulador, que tendrá la propiedad arr, y un método acumular(dato) que irá metiendo en arr lo que reciba como parámetro. Quedaría así:
function Acumulador() {
this.arr = [];
this.acumular = function(dato) {
this.arr.push(dato);
return this.arr;
};
}
var acumulador = new Acumulador();
acumulador.acumular(2);
acumulador.acumular(3);
alert(acumulador.arr); //Para comprobar