В общем, как это часто бывает, виной всему невнимательность. Оказалось, что AJAX отправлял данные на экшн, без указания id сущности, поэтому проверка была как для новой записи.
В итоге такая конструкция работает как нужно:
[['amount'], function($attribute){
if ( $this->$attribute != $this->getOldAttribute($attribute) ) {
$this->addError($attribute, \Yii::t('app', 'Нельзя изменять сумму счёта'));
return false;
}
}, 'when'=>function($model, $attribute)
{
return $model->getOldAttribute('status') != self::STATUS_IS_PENDING;
}]