It depends on your design intent. If you want the settings to remain constant during the entire execution cycle, you can initialize the values once during the constructor. If you want the batch to be able to react to changes "immediately," retrieve the custom settings during the execute call. I've used both designs in various projects, and it always comes down to if you expect the additional flexibility.
As an example of the during-execute method, I had an API dispatcher bath class that needed to have the ability to enable/disable/throttle API calls in real-time. Providing the option to change it in realtime allowed the batch to run for an hour at a time without constant restarts, drastically improving performance and reliability. In many other cases, I only needed to load the settings on startup, so the values were initialized in the constructor or start method.