Объект не является массивом. Если вам нужны элементы с числовым индексом, используйте массив.
Если вы хотите, чтобы именованные элементы использовали объект или ассоциативный массив.
Что касается того, почему вы получаете другое поведение, это потому, что в массиве вы не указываете индекс, поэтому PHP использует длину массива в качестве индекса. Для объекта необходимо указать имя (в данном случае «a»).
Другая вещь, которую вы можете захотеть сделать, это иметь Object с элементом, который является массивом:
$obj = new stdClass;
$obj->arr = array();
$obj->arr[] = 'foo';
$obj->arr[] = 'bar';
также не забывайте, что вы можете привести массив к объекту:
$obj = (object) array(
'arr' => array(
'foo',
'bar'
)
);