I happened to do something along those lines recently, in LWJGL: https://github.com/euccastro/esterqueira/blob/pong/src/esterqueira/logic.clj
code is not exactly pretty, but it avoids atoms or mutable state
re: the problem of complicated updates in a deep data structure (IIUC the question) I'd recommend giving specter a try https://github.com/redplanetlabs/specter
basic structure is inspired by Racket's Big Bang: https://docs.racket-lang.org/teachpack/2htdpuniverse.html?q=big-bang
this is the main loop that interfaces that logic with glfw/opengl: https://github.com/euccastro/esterqueira/blob/pong/src/esterqueira/gl.clj#L164