Если я правильно понимаю, то там не совсем так. Опять же, никакой магии нет, просто докидываем провайдеры в инжектор — в forChild в роутере докидываются значения в мульти токен. Мульти токены можно определять только на одном инжекторе. По этой причине, например, нельзя докинуть в глобальный мульти токен значение в декораторе директивы, только в локальный (как, например, NG_VALUE_ACCESSOR). Но так как в лейзи роуте создаётся как бы свой глобальный инжектор, просто наследующий значения из общего, то тут можно добавить в мультитокен значений для всех дочерних инжекторов, которые в этом лейзи роуте сидят. Так работает ROUTES в случае роутера и лейзи модулей. Но ничего спецефичного в связке именно в forChild/forRoot нет. Суть просто в том, что в списке imports могут быть как модули, так и конструкции ModuleWithProviders и так уж повелось удобно это делать статичными методами. Если не ошибаюсь, можно такие штуки хоть утилитными функциями клепать.
EDIT: Не, лейзи тоже перетирают мультитокены.