Fixed.
Could it have anything to do with:
Yes and no. The actual problem with the repeated activation was how we were disabling the buttons - to make the react components re-render we essentially need to give them a new property. For the button tray we give react an array of button data to render - react doesn't care about data inside that array changing, only that the array itself is a different object. The code that disabled the button didn't update the button array, so react didn't see any need to re-render the component, so the button never actually updated into a disabled state.
Whilst I was in there I realised that at some point we were both creating a much larger array of buttons than we need (it had been bumped up to 45), and that we were creating dummy objects with default data rather than just using a sparse array and inferring the lack of an object at a specific index being a disabled button. Which is where this problem came from - I didn't realise the Button compoent used in the button tray is also the component used for a bunch of icon-based buttons, and the code inferring if a button should be disabled only considered the title property, ie, text to display on the button, and not the presence of an icon key.
Ninja Edit: The reason the buttons are still probably clickable in some places is an artefact of how the click event handler is bound to the stack of elements that build the button, mixed with the fact we're using SVG based icons. There'll be some clickable default area based on some non-rendered part of the SVG that isn't being scaled with the rest of the SVG itself, but normally this isn't an issue because we have the whole button body itself to act as backing for the clickable area too.