The first is actually creating a numerically indexed array key, the second a string key. You can use type casting to force consistent behavior.
$test = array((string) '3' => 5);
$test[(string) '3'] = "New value";
Update, these behave identically for me on PHP Version 5.2.13:
$test = array('3' => 5);
echo '<pre>'.print_r($test,true).'</pre>';
$test['3'] = "New value";
echo '<pre>'.print_r($test,true).'</pre>';
$test = array((string) '3' => 5);
echo '<pre>'.print_r($test,true).'</pre>';
$test[(string) '3'] = "New value";
echo '<pre>'.print_r($test,true).'</pre>';