*Edit: what I propose below is apparently known as the double-submit cookie scheme. And, contrary to the original question, it is a separate nonce altogether as well (or even a simple hash of the session id)...
Looks like the simple solution (i.e., CSRF protection but with all-cacheable web resources) is to just add a separate cookie containing the anti-CSRF token but accessible to page javascript. And add this to all requests from the page (e.g., just before they're sent).
In other words, when the client logs in, I'll actually set two cookies (one HttpOnly sessionid and one nonp-HttpOnly anti-CSRF token, accessed by page scripts). So, the server will store (along with a client sessionid) their anti-CSRF token value and validate that it's the same value as the one originally set via the second cookie. If validation fails, you have a potential CSRF.
This approach is also mentioned in some other places on the web...