JSX doesn't violate referential transparency. A component either is referentially transparent, or it isn't; nothing about how it's invoked changes that.
Put another way: React calls your components, not you. You pass the component function itself to React.createElement, not its result.
Put another way: React calls your components, not you. You pass the component function itself to React.createElement, not its result.