Seems like the best way to do this is using an append buffer. You have to be careful that you're not relying on the order that you're appending elements as the multi-threadedness is designed specifically to allow things to be added in at random. I had to append the data one Triangle at a time, which stops me from using an index buffer but I couldn't see any other way to do this.
If anyone comes up with a better solution I'd be happy to hear it.