Changing a product's Tax Category ID onSaveProduct event
Setting the new field value onSaveProduct meant that the only the general element and its custom field data was being saved and not the tax ID on the product model.

To solve this, the onBeforeSaveProduct event should be used. This allows modification of the product model before it's saved.

craft()-&gt;on('commerce_products.onBeforeSaveProduct', function(Event $event){
    $product = $event-&gt;params['product'];
    $criteria = craft()-&gt;elements-&gt;getCriteria(ElementType::Entry);
    $criteria-&gt;id = $product-&gt;productFilterArtist[0]-&gt;id;
    $artist = $criteria-&gt;first();
    if ($artist &amp;&amp; $artist-&gt;getContent()-&gt;vatRegistered) {
        $product-&gt;taxCategoryId = 1;
    }
})