This helped explain it to me - https://medium.com/@eugeniyoz/angular-signals-reactive-context-and-dynamic-dependency-tracking-d2d6100568b0
My read is that both the signal() function and the computed() function make calls to an external dependency tracking system.
When you call signal() from inside computed(), that signal basically registers as a dependency of that computed function. So thats how computed can figure out when it needs to update.