What John Hartsock probably meant (in his answer) was:
var my2DArray = [], i, j;
for(i = 0; i < 5; i++){
  my2DArray.push([]);
  for(j = 0; j < 5; j++){
    my2DArray[i].push("Array Position " + i + ", " + j);
  }
}
alert(my2DArray[0][0]); //will alert "Array Postion 0, 0"
alert(my2DArray[1][4]); //will alert "Array Postion 1, 4"
Working jsfiddle demo here.
OR using a temporary reference to each new 'sub-array' (can be faster):
var my2DArray = [], i, j, tempRef;
for(i = 0; i < 5; i++){
  tempRef = my2DArray[i] = [];
  for(j = 0; j < 5; j++){
    tempRef.push("Array Position " + i + ", " + j);
  } 
}
alert(my2DArray[0][0]); //will alert "Array Postion 0, 0"
alert(my2DArray[1][4]); //will alert "Array Postion 1, 4"
Working jsfiddle demo here.
Explanation: 
One normally uses var arr=[]; to create an array and arr.push(/*content*/); to add a new array-item to the end of the array (so it is essentially the same as arr[arr.length]=/*content*/;).
Thus, if you have an array (my2DArray), then you add new arrays (since arrays are passed by reference, not copied) to your main/root array: my2DArray.push([]); to make my2DArray[my2DArray.length] reference this new array (and once this array exists, you can do stuff with it: my2DArray[index][sub_index]).
So, say you have just one loop, then you could also add a complete new array with a single push: my2DArray.push([0,1,2,3]);
Put differently, (using what is explained above,) this single line will create exactly the 2d array you gave as example in your question:
for(var array2d=[], i=0; i<4; array2d[i++]=[0, 1, 2, 3]);
alert(  array2d[2][1]  );  //returns '1'
jsfiddle demo here.
By the way, technically there aren't even arrays in javascript, just fancy objects with some special features (excellent explanation here: https://stackoverflow.com/a/2891043/588079)