ну так unique и должен возвращать false если уже есть запись с пустым таким полем. По сути вопроса, не вдаваясь в подробности того что у вас там какая-то лажа, смотрите в сторону skipOnEmpty
[['field_name'], 'string', 'skipOnEmpty' => true], //у стринг валидатора по-умолчанию и так 'skipOnEmpty' => true