Right, I’ve finally got to the bottom of this after much googling.
The issue is $post->ID. It looks like the global $post is not accessible at that point when you’re using the standard (working code) when the variable is through a Post Object.
Changing it to this, seems to have done the trick:
$thumb = wp_get_attachment_image_src( get_post_thumbnail_id( get_the_ID() ), 'large' );
$thumb_id = get_post_thumbnail_id( get_the_ID() );