markForCheck отметит дерево компонентов от рутового вплоть до того, в котором был вызван чек, что в следующем цикле CD они должны быть проверены (ChecksEnabled = true, если не ошибаюсь)
да, это минус даже onPush. Можешь погуглить, есть статья, в которой парни рассказывают как сделать ещё быстрее) но сложнее. Они делают detach для рутового компонента, и весь change detection делают руками (detectChanges)
вот как реализован сам markForCheck: export function markParentViewsForCheck(view: ViewData) { let currView: ViewData|null = view; while (currView) { if (currView.def.flags & ViewFlags.OnPush) { currView.state |= ViewState.ChecksEnabled; <----------------- } currView = currView.viewContainerParent || currView.parent; } }