Custom properties can be applied to any element as well. You can constrain the effects of either to only the elements they should affect in your CSS rules.
Well, no, they can't. That's the point the article is making.
Classes can compose arbitrarily, i.e. class="size-small size-big"
Whereas data-size="small big", while valid syntax, would not be styled by a rule targeting elem[data-size="small"]