What are the values of data[[i]][[1]] ? Are they pairs {lat, lon} or GeoPosition objects or Entity objects?
When GeoDistance gets a pair of GeoPosition objects, the distance computation is performed locally in your computer, which is faster. When GeoDistance gets Entity objects or geo primitives (like GeoMarker) the computation is performed in the Wolfram geo server because it may involve accessing data about polygons, etc, which is accessed faster in the geo server, but there is the penalty of the transmission time. With point-to-point computations (i.e. not involving polygons) the results should be very similar.
When you have lots of {lat, lon} pairs, it is worth grouping them in a single GeoPosition object. For example, take 50000 random geo locations:
In[1]:= positions = Table[{RandomReal[{-90, 90}], RandomReal[{-180, 180}]}, 50000];
This computation is quite fast:
In[2]:= AbsoluteTiming[GeoDistance[GeoPosition[positions], GeoPosition[{-34.608116, -58.370380}]];]
Out[2]= {0.149878, Null}
The result is a QuantityArray expression containing 50000 values in miles. Use Normal to get a list of Quantity objects, or QuantityMagnitude to get a list of the respective numerical values (in miles).