On the third line (test[0] = new Array();), you set test[0] to a new array.
On the next line (test[0] = "hello";), you set it to a string.
Then with test[0][0] = "world"; you try to set that string's first index to "world".
That's like trying to do "hello"[0] = "world";. You can't do that. The String object in JavaScript is immutable.
var test = Array(); makes a 1 dimensional structure... like this:
0 - [_]
1 - [_]
2 - [_]
3 - [_]
4 - [_]
Then, setting the first spot to a new array gives it a second dimension (but only in the first spot).
0 - [_][_][_][_][_]
1 - [_]
2 - [_]
3 - [_]
4 - [_]
Then, setting the first spot to "Hello" gets rid of the array you put there.
0 - ["Hello"]
1 - [_]
2 - [_]
3 - [_]
4 - [_]
At this point, test[0] is "Hello". Not the standard Array that you want it to be. You can't set [0] of a string.
When you ask try to set [0] of a String like "Hello", nothing actually happens, so the line test[0][0] = "world"; isn't really doing anything at all!.
Deep down, Strings are the same as Arrays. Array operations can even be applied to a String. The extent to which browsers expose the underlying similarities isn't really consistent. In FF, Chrome, and Safari, you'll test[0][0] is getting [0] of "Hello". In those browsers, Hello is kinda the same as ["H","e","l","l","o"]. So, test[0][0] = "Hello"[0] = "H". IE doesn't treat strings that way. That's why you're seeing inconsistent behavior.
Hope this helped!
EDIT: As someone else has already suggested, using charAt(x) is the function you should use when trying to pull a character at a specific position from a string.