I've generally found React to cause more problems than it solves, as I've said in my series on the topic of how just plain stupid and wasteful it is.
Even your rewritten form though has a bunch of issues... Where's your FIELDSET to isolate user changeable values from static ones and/or be the accessibility landing? Why waste for/id there when you could wrap the labels and add one BR simplifying the code? Why slop the markup for scripting only junk into the markup? Why put scripting only error DIV and those data- attributes in the markup like it's still 2009 when we have setCustomValidity?
Your final question though spells it out. OF COURSE you can make their Tic Tac Toe demo cleaner/simpler without React. That's true of most everything built with EVERY one of these garbage half-tweet front-end frameworks. The clowns who CREATE these systems don't know enough about HTML or CSS to even be playing with JS yet, which is why they need these multi-megabyte libraries of derpitude to cover up for their own ineptitude!
https://codepen.io/jason-knight/pen/dyVzpEd
Easy-peasy Lemon-Squeezy. Particularly if you know how to work with the DOM and leverage it to your advantage. And for all the nose-breathing nonsensical claims to the contrary, that level of "eye cans haz teh intarwebs" stupidity scales upwards. The bigger the project, the more and more bloated, pointless, and harder to work with the code vomited up by framework dev's becomes.
Because if they knew how to code in the first place, they wouldn't be using a framework.