Сделайте проверку на $this->isNewRecord примерно так
public function rules(){
$rules = array(
array('login', 'match', 'allowEmpty'=>false, 'pattern'=>'/^([A-Za-z0-9-_$]){3,16}$/', 'message'=>$this->getErrorMessage('is_login'), 'on'=>'control'),
array('name', 'match', 'allowEmpty'=>false, 'pattern'=>'/[a-zA-Zа-яА-ЯёЁ]+\s{1}+[a-zA-Zа-яА-ЯёЁ]+$/u', 'message'=>$this->getErrorMessage('name'), 'on'=>'control'),
array('password,special_password', 'match', 'allowEmpty'=>false, 'pattern'=>'/^(?=.*\d)(?=.*[A-Za-z])[0-9A-Za-z-_!@,#$%]{6,16}$/', 'message'=>$this->getErrorMessage('is_password'), 'on'=>'control'),
array('special_password', 'coincidePassword', 'message'=>$this->getErrorMessage('coincide_password'), 'on'=>'control'),
);
if($this->isNewRecord){
$rules_for_new = array(
array('login', 'unique', 'className' => 'UsersModel', 'attributeName' => 'login', 'message'=>$this->getErrorMessage('login'), 'on'=>'control'),
array('mail', 'is_mail', 'on'=>'control'),
);
$rules = array_merge($rules,$rules_for_new);
}
return $rules;
}