I just don't understand how the same method - symbol.symbolLayer(n) - can trigger the error in one place but not in the other (with everything identical in QGIS).
Matthias has removed the problem by removing the dependence of the SIP symbol bindings on RTTI (https://github.com/qgis/QGIS/commit/c3852c0). However, I still wonder if I can work around the issue, given that the OpenLayers call to symbol.symbolLayer(n) doesn't trigger the error.
If I can work around it, I could maintain qgis2web compatibility back to 2.8 as I currently do. Otherwise, I'll have to switch to 2.18, and I don't like not supporting LTR (or I'll have to ask for c3852c0 to be backported to 2.14).