В итоге, хотя сначала я делал через принудительную перерисовку,
работает решение, когда KrlDynRestore.Update вызывает Views.Update для данной вьюхи (это, технически, помечает её прямоугольники в окнах как требующие обновления) и добавляет корневой фрейм окна в список.
Затем Action после Omnicast-а для всех добавленных в список корневых фреймов вызывает Views.ValidateRoot.
Это получается оптимальнее, чем дёргать Windows.dir.Update(NIL), т.к. применяется только к тем окнам, в которых есть изменившиеся вьюшки.

И, кажется, исходное моё решение с вызовом RestoreRoot - опасное. У RestoreRoot есть предусловие, что у обновляемого фрейма нет накопленных отложенных изменений... А "кто их, зверюшек, знает", что там по широковещанию вьюшки накопят... (RestoreDomain гораздо хитрее устроена - и она как раз документирована для использования, в отличие от RestoreRoot).

В итоговом решении используется документированное или известное, как Windows.dir.Update(NIL): Views.Update документирован, а ValidateRoot является просто оптимизацией для Windows.dir.Update (который, собственно, тупо и вызывает ValidateRoot для всех окон).

Ниже приведу исходник KrlDynRestore. Там ещё у Update добавлен параметр period: вьюшка может указать в милисекундах периодичность обновления, и чаще неё её не будут перерисовывать. Только если используется period, то нельзя мухлевать в самой вьюшке, надо честно вызывать Update при каждом Omnicast-сообщении (как мухлюют часы, допустим, сравнивая, изменилась ли секунда).