system.flush vs system.println

Would that then mean that

system.print or system.println

operates in a asynchronous manner
i.e you call it, this copy's data to a send buffer and immediately starts executing other commands?

Yes, that's exactly how it's implemented.

I have tried to measure the millis before and after each Serial transmission in order to work out a dynamic adjustment to pause the main loop the correct number of millis to ensure it triggers every 1/40 of a second however over 30 mins this is drifting by 20 - 30 seconds.

If you want a more accurate timing, don't use the delay() call to pause your sketch but wait in the main loop until millis() reached a specific value. See the BlinkWithoutDelay example of how you can achieve that.