That’s your generation that happens once. The browser still needs to render it. Sure, rendering it on the client may cost the client a bit more, but the client generally has the computational power to spare.
Which becomes a far more important issue when dealing with bandwidth or CPU constrained devices, or artificially imposed constraints due to data usage costs.
We can also cache some of the dynamic JavaScript, depending on the scenario but your point stands.
You usually can't because of users who are signed in needing slightly different pages etc.
While not as fast as a purely client cached page, the server can selectively cache content, even when some bits of the page are dynamic.