На самом деле ты получаешь не ошибку, а Warning, и так и должно быть, т.к. это ломает логику приложений и ООП в частности. Правильнее всегда задавать структуру и ее наследовать, по крайней мере в будущем, когда наступит момент рефакторинга кода, ты всегда сможешь найти нужные свойства и их расширить.
А пример рабочий с выключенным уровнем ошибок:
<?php
error_reporting(error_reporting() & ~E_WARNING);
$std = new stdClass();
$std->first = new stdClass();
$std->first->third = 3;