Каким образом и где определяется свойство isNewRecord класса BaseActiveRecord в Yii2?
Сергей Протько всё верно описал. Свойство _oldAttributes используется для реализации dirty attributes.При выборке данных, например методом findOne(), строка из БД преобразуется в объект AR методом BaseActiveRecord::populateRecord(). В значение свойств _attributes и _oldAttributes записываются данные, полученные из БД, в виде ['columnName' => 'value'].При установке атрибутов ($customer->name = 'James') магический метод BaseActiveRecord::__set() модифицирует свойство _attributes.При сохранении записи метод BaseActiveRecord::updateInternal() получает только измененные атрибуты (сравнивая свойства _attributes и _oldAttributes), чтобы обновить в БД лишь нужные поля.По умолчанию свойство _oldAttributes равно null. При создании нового объекта ($customer = new Customer()) оно не изменяется, поэтому на основе его и определяют, является ли запись новой или нет.
это свойство по идее устанавливается сразу после загрузки данных из базы (в oldAttributes и в attributes). Так, перед сохранением мы можем проверить что мы изменили, так как изменениям будет подвержен только attributes. Ну а для новоиспеченной модели oldAttributes всегда будет пустым.