Since others have taken their time and have come up with some very good explanations, I will try to address your questions (within your question) explicitly:
At this point, I'd think that mySoundArray[0] would reference the same object as myAmbientSound
But myAmbiendSound does not reference anything? Look, you wrote this yourself:
var myAmbientSound:Sound;
The above just creates a local variable of type Sound, a reference. All local variables are references, but not all references are local variables. Object properties are also references, for example. Anyway, the expression above does not create an object of class Sound. You just created a locally scoped reference with a special value of null, that's it. It may reference a Sound object though. There is, however, a difference between creating a variable and creating an object and/or referencing it. The above creates a variable. Operator new creates an object and returns a reference to it. The assignment operator = makes the reference on the left side reference the object/value referenced by the reference on the right side. Yes, that sentence does not read good at all, but it describes the logic exactly. During its lifetime, a reference can equally well reference many different objects at different points in time. One way to have the local variable above reference an object would be:
myAmbientSound = new Sound();
In your case however, the variable holds a special null value instead, since you did not assign it any object reference. And it does so during the entire runtime of your snippet.
Before I explain what you end up putting into your array with the line:
var mySoundArray:Array = [myAmbientSound ...
, you have got to understand that array elements, much like object properties, are references too - e.g. mySoundArray[0] may holds a reference to an object, and mySoundArray[1] and so on.
Assigning using the above syntax - [ value1, value2, value3 ... ] - creates a new array object, and establishes its element values as references to whatever "value1", "value2", "value3" reference each, respectively.
Now, since we have established that the local variable called "myAmbiendSound" has a null value, your first array "element" hence also ends up having a null value. Initially. Because in the loop later on you have the first element (or, literally, element at index number referenced by variable i) reference a new Sound object. "At that point", since myAmbiendSound is still (and for the entire scope of your snippet) null, of course comparing the two for equality will fail - they do not reference the same object - the former is null and the latter is assigned a reference to the Sound object.
Also, a minor correction: accessing an object does not throw an exception. Accessing properties of an non-object - i.e. using dot notation syntax on a reference that is null, does result in a thrown exception, however.
I hope this clears matters up. I consider it an addition to all said earlier here.