So after a long period of investigation it turns out that the threading wasn't the culprit.
So far I've narrowed the problem down to our Interstitial ads that also run in the app. The interstitial launches after our load process, and once it closes we send the user to the screen that contains the 3 Banner ads. If the interstitial receives an ad (whether it displays it or not), then it is likely that at least one of the banner ads will fail to load. Usually 2 or 3 of them fail, but very occasionally all 3 load correctly. If that interstitial gets a didfailtorecievead notification then all 3 Banner ads work fine.
The problem only manifests on iOS 7, iOS 8 devices do not show the error.
The problem has been present in SDK versions 6.8.0, 6.11.1 and 6.12.0.
I have pulled the app apart trying different ways to delay the load of the page containing the banner ads until I know that the Interstitial object has been cleared from memory, making sure that all pointers to it are set to nil so that ARC will clean it up, yet the problem still persists.