Awesome man,
This works even on ExtJS 5 !
Thx 
Later edit:
It seems that on the ExtJS 5 while hovering the mouse over the arrow expander, the disabledCls vanishes, and I think that's maybe they use set('cls') for that which overrides ours..... 
I was trying to use addCls to the view of the record like in the example bellow, but this has more issues because they are removed by the framework on collapse / expand of the nodes.....
I'll keep trying to find THE solution, but I also think that this shouldn't happen and I've reported this as bug here (fiddle included).....
PHP Code:
isThirdState: function (node) {
return node.isThirdState;
//return node.get('cls') == this.disabledCls;
},
setThirdState: function (node) {
//node.set('cls', this.disabledCls);
node.getOwnerTree().getView().addRowCls(node, this.disabledCls);
node.set('checked', false);
node.isThirdState = true;
},
unsetThirdState: function (node) {
//node.set('cls', '');
node.getOwnerTree().getView().removeRowCls(node, this.disabledCls);
node.isThirdState = false;
}