It’s turns out that you can add return=true
to any of the theme template tags:
shopp('product', 'id', 'return=true');
As of writing this, that is not mentioned in the documentation at all. Shopp support was also able to confirm that the $post->ID variable does get over-written in a number of situations, so the strange value I was seeing is not surprising.