So, on to the technique I'm currently using:
Basically, I've taken all :hover states out of my css, and replaced them with a hover class so the browser won't trigger hover-related paints by itself. Then, I have created a simple mixin that uses mouseover and mouseout events to set a boolean hover property. If the hover property changes, I either add or remove the hover class. The result is the same visual hover effect as the :hover css state, but controlled entirely by javascript, rather than by the browser.
I've also created a scroller subkind that waterfalls the scrollStart and scrollStop events, so that contents of the scroller can detect when they're being scrolled. Using these events, the hover mixin can now selectively prevent adding/removing the hover class if it's inside a scrolling scroller. The result is no hover-induced repaints during scrolling, which makes for especially noticeable speedups on mobile devices.
The idea was inspired by some techniques I saw on the web where people disable pointer events inside active scrollers. The problem with the pointer-events technique, though, is that this also blocks clicks and taps etc. This is a problem for scrollers that simulate momentum and coast along after the users' drag interaction has finished. By only preventing visual hover effects while still allowing pointer-events, such interruptions in the users ability to interact with the controls inside the scroller are prevented.
I'd be interested to know what you all think about the general idea, how to improve it, if there's a place for this in enyo core, etc.