Unfortunatly the surface extractors aren't particularly smart about the order they traverse the voxels. Ideally they would process all the voxels in a given block before moving on to the next block, but actually they just process the whole requested region one slice at a time.
If you have a large region, and within it a block of size 32x32x32, then the surface extractor will enter that region, process 32 voxels, and then leave out the other side. It will then reenter that block 32x32 = 1024 times, and each time it has to find the block in the map. Hmmm... actually that's pretty horrific
Anyway, the fact that the volume is made of blocks is an implementation detail which shouldn't be exposed to the surface extractors. However, the VolumeSampler does have knowledge of this. I think the VolumeSampler could have a 'moveToNextVoxelInRegion()' function which iterates over the voxels in the optimal order, and then the surface extractors should make use of this.
Actually I think this functionalilty used to exist, but it got lost at some point...