Unless something significant has changed in React with the introduction of state hooks, it works like this:
React uses a single immutable state object to store the state items. Whenever you change any item of the state a new state object will be created and the component will be forced to update. In this case, that means a full Scheduler update. It's usually fast but it's noticeable (100 - 500ms).
Using the state hook (useState) makes it look like the individual state items (counter, daypilotConfig) are independent but they are part of the same state object. There is no way for the Scheduler to detect the actual change - or at least it would deny the React state logic which is designed to avoid deep comparison of state items.
1. I would recommend wrapping <DayPilotScheduler > in a special component that uses its state to only store the Scheduler properties. For communication with other components, you can use props and/or methods. When using props, be careful with mapping the parent component state to props directly as it would replicate the same problem on level up.
2. Inside the wrapper component, you can also avoid using the state to store the Scheduler properties at all. The Scheduler properties can be set using inline attributes of <DayPilotScheduler> element and changes can be made explicitly using the direct api:
this.scheduler.update({cellDuration: 50});
This will also ensure that the optimized update will be used when available (see https://api.daypilot.org/daypilot-scheduler-update/) and generally give you more control over the updates.