rest_api_init is run on every rest call to endpoint

This is the expected behaviour. When you register routes with the REST API you’re registering them for the current request. This is the standard pattern for WordPress. It’s the same behaviour with register_post_type(), register_taxonomy(), register_setting(), register_nav_menu(), register_widget() and so on. Actions and filters registered with add_action() and add_filter() are also registered — and fire — for every request.

Of course this makes sense when you consider that none of these functions write anything to the database, which is the only way it would possible for these functions to only run once. It makes more sense when you consider that reading the values from these functions from the database would only make them slower. Not to mention that quite often the arguments passed to these functions are instances of classes or class methods, which are things that you couldn’t save to the database.