TL;DR Your app’s “brain” can be anywhere enough data fits (with sufficiently low usability latency for your domain), barring security concerns.
I’d take the learning opportunity to question that feeling of “wrongness” and see if you can justify it from observation and logic within your actual use. Maybe it’s just dogma!
When faced with a decision like this, I try to find a way to avoid making it. In Clojure land, you can get pretty far with fns on data, including from libs, in pure CLJC (platform-independent) territory. Then, you’re free to make platform-dependent decisions where there’s a specific, valid reason to (like security, as @Webdev_Tory mentioned, which should still be specific to the sensitivity of data you’re sending, relative to your trust level of the browser’s memory or durable storage). As to storage, memory, bandwidth, or processing limitations, that again depends entirely on the realities of your use case. The specifics of what you’re building and what you observe trump generic wisdom.
Clojure-ville gives you the flexibility to make decisions granularly, and specifically for your use case. Don’t artificially constrain yourself early. Researching online can lead you astray that way. It’s easier to write about generic, framework/platform questions than problem-specific ones, so that’s what an overwhelming majority of online material covers. Conversely, it’s easier (and wiser) to make programming decisions based on the specifics of what you’re doing (and where you’re going).
By assuming less about the environment while building, you’ll end up with smaller, simpler, decoupled pieces that can be flexibly re-composed as needed. These sorts of small, stable, specific, yet composable pieces are some of the most valuable bits of software we build.