This issue has been discussed back in October here. This is a new question as CoreBluetooth is fairly new and some changes might have occurred since then.
I have a BLE device advertising every 2 seconds. Scanning is initiated using:
[self.CM scanForPeripheralsWithServices:nil options:0]
Which returns most often (via the centralManager didDiscoverPeripheral callback) around 2s to 4s later. (CM is my CentralManger)
However, about 30% of the time, the scan takes 10 to 18 seconds. WiFi and BT in nearby devices has been disabled to clear the spectrum as much as possible. The time to scan seems unrelated to RSSI. Which is -40dB when next to the iPAd3, -70dB when about 5 metres away in another room.
[self.CM stopScan];
is called before the scanWithPeripherals as it reduces the occurrence of really long waits.
No connection is being made. No characteristic or services data is being requested. Advertising data is sufficient.
There is a useful TI demonstrator app. This gives similar results (actually slightly worse as it doesn't make any stopScan calls)
The CBCentralManagerScanOptionAllowDuplicatesKey option as seen in this Stackoverflow answer if anything seems to lengthen discovery times.
Obviously, the next step is to use some more advanced BT sniffer / advert generation tools to further characterise this CoreBluetooth response.
This is another useful SO question, but does not elaborate enough on response times.