The correct approach IMO is to leave all properties atomic unless there is a demonstrable performance problem as revealed by profiling the code.
However, that won't help in this instance because making the property atomic does nothing to make the internal state of the NSMutableArray thread safe. You'll need to make the property atomic and introduce some sort of synchronisation to stop one thread from modifying the array (i.e. adding or removing objects) while the other is accessing it. As this is quite tricky to enforce, I probably wouldn't expose the array as a property at all. I'd have methods on the parent object something like:
-(void) addLocation: (id) newLocation;
-(id) locationAtIndex: (NSUInteger) index;
etc. analogous the the NSMutableArray methods and they'd all be synchronised. If there were a property that returned the whole array, it would be read only and would return an immutable copy of the real array.