You have the point distance tool Point Distance—Help | ArcGIS for Desktop
but the results could obviously be quite large. a search radius would reduce this but obviously might not suit most use cases.
When you get the table you could then wrangle it, something like create a cursor and produce a dictionary of all input OIDs as a key, the value being a list of a list - [[distance, OID], [distance, OID], [distance, OID]....]. Iterate over the dictionary, sort the values and select the 3 smallest values and grab the OIDs.
This wouldn't be very hard to implement, though I do hope someone has a more trivial way.