Just an update for anyone wondering how to solve this:
I have found a solution using 5 (well, maybe 9 simple steps) -
Ride on Zwift as usual, but when setting up your Fitbit to record, set it as ‘Bike’ instead of ‘Spinning’. (this way the .TCX file you download actually contains heart rate data and isn’t just empty)
Download your Zwift ride .FIT file from my.zwift.com
Download your Fitbit activity from the fitbit website - it’s in .TCX file format
Use this amazing website to combine the two files into one .TCX file that contains heart rate: http://gotoes.org/strava/Merge_Heart_Rate_TCX_With_Position_TCX.php
* At this point, you’ll have a working .TCX file that you can upload, but on Strava the elevation is completely out because it’s using their default elevation map instead of the Zwift elevation.
Open the .TCX file with a text editor, i use text Wrangler on Mac OSX.
Scroll all the way to the bottom until you find the <Creator xsi:type=“Device_t”> line and select all the contents from that line all the way to the bottom of the file.
Replace that data with this:
<Name>Garmin Edge 800</Name>
<Name>Garmin Connect API</Name>
Save the changes, MAKE SURE ITS STILL A .TCX FILE!!
Upload to Strava and enjoy the correct elevation data, and your Fitbit heart rate data together in one place
* I spent last night playing around and researching online as to why this was the case and it turns out Strava will only use the elevation data from within an uploaded activity if it was recorded on a device that they have on their database, and so that last section of code just fools Strava into thinking you recorded your activity with a Gramin Edge 800 (which is what the actual zwift.FIT files claim to be recorded on).
Hope this helps anyone who needs it!