What breaks the layout is not the variable bindings per se of course, but the ly:grob-property calls, and that's because you are asking for information too early. At the moment after-line-breaking is run, page layout is not done yet. Asking for the Y-extent of the brace indirectly triggers calculations of the distance between staves while the backend is generally not yet in a state where it is able to compute them correctly. The X-extent of SystemStartBrace is unset (
https://lilypond.org/doc/v2.24/Documentation/internals/systemstartbrace) which means LilyPond uses the default of computing it from the grob's stencil, so when you ask for the X-extent, it will try to compute the stencil, and thus the height, leading to the same problem. Similarly, the X-offset is based on side positioning (ly:side-position-interface::x-aligned-side) so it will request the stencil.
On the other hand, the Y-offset is always 0, so you don't get problems, but it's not very useful either.