Разобрался. Если кому интересно:
Дело было, на самом деле, во внутренностях ангуляра, а точнее в том, что он при компиляции ноды принудительно проверяет наличие некоторых атрибутов, и делает для их содержимого $scope.$watch, внутри которого делает attrs.$set.
Так как я добавлял ngRequired после компиляции ноды, то мне надо было просто сделать что-то типа:
$scope.$watch(attrs.formControl + ".required('" + (element.attr('name')) + "')", function(value){
attrs.$set("required", !!value)
});
А ngRequired, как показано выше, отслеживает значение атрибута required и обновляет валидацию.