JSON Forms takes advantage of React memos to increase performance. If the performance is good enough when not using onChange then it should also be good enough when using it. The reason is that we specifically have a check to prevent rerenderings when the onChange handler changes.
For the memo barriers to work you need to make sure to hand over the same schema, uischema, renderers etc. for each rerender call. If you construct any of these from scratch, then JSON Forms will notice that the props changed and potentially trigger a full rerender. This will then lead to the described performance problems.
Very likely you don’t hit this problematic case without the onChange as the parent component which renders JSON Forms does not rerender without it.
Can you show the code where you invoke JSON Forms?