I also strongly suspect the way they're able to make it free is by caching the results, so each translation only happens one time regardless of how many requests for the page happen. If they translated dynamic content, they couldn't (safely) cache the results.
If they are caching by URL you can have dynamic HTML generation or a JS generated page that is the same on every load.
If you are caching by the text then you can do the same for HTML or JS generated (you are just reading the text out of the DOM when the JS seems done).
Most js heavy pages retrieve data from APIs, and the static parts of the code is just layout and menus, which isn't the part that people care most about translating. Thus why GP said "added via Javascript later." The important part of that isn't the "Javascript" , it's the "later."
Brave browser does it already though, but sometimes it's unusably slow.