I found the root of the problem.
Sub-window objects were defined inside MenuBar object. Sitting there, they were unable to find transient parent window (e.g main window of the app), and behaved like ordinal top-level windows, same as main window.
I checked 2 cases: MenuBar is declared as a children inside some item inside main window, and as a property value. In both cases transient parent window was not founded. It seems MenuBar is a some kind of special object which breaks the transient parent search algorithm.
The solution was to place sub-window objects as child objects to some other better item, probably right inside main window.