I did not know that the FID was not preserved by this tool. Strange. As Chris recommended, calculate a unique ID for each point before you use the buffer tool.
The unique ID I use for all my points is a concatenation of the X and Y coordinates in a text field I call XY_LINK. You should be able to create a join field without creating any new feature class. Create a text field that is long enough to hold 2 coordinates and 4 curly brackets (not a comma, since I find that causes Join issues). Then do a Python Field Calculation on the points like this (this works for State Plane coordinates):
Parser: Python
Show Codeblock: Checked
Pre-Logic Script Code:
def Output(FirstPoint):
FPX = round(float(FirstPoint.X), 4)
FPY = round(float(FirstPoint.Y), 4)
return "{%(FX)012.4f}{%(FY)012.4f}" % {'FX': FPX, 'FY': FPY}
Your XY_LINK Field Name:
Output(!Shape.CENTROID!)
This creates a 28 character point descriptor that is unique if no points overlap. An example from my data is: {6130961.7120}{2261115.2232} You may have to mess with the formatting of the number to work for your coordinate system depending on the resolution and tolerance of your layers. 012.4f might be 015.8f or something else that works for your data. (Note it added a trailing 0 to the X coordinate so that the numeric digits of each coordinate are always 12 characters so that they can be always be parsed from the same character position in every string and they sort numerically)
Index the XY_LINK field in both the point layer and the polygon layer and you should find that the correct point will show up when you make the polygon layer the target and the point layer the join layer. Or perform a relate from your point to your polygons to see if they select the correct set. The tolerance adjustment of the buffering process may make the rounding not work, but if this XY_LINK ID is calculated on the points before you do the buffer it provides a unique ID that also tells you if the point still exists in that location using Joins and standard SQL. You can also use the FID in a static long field as a secondary join to identify points that were moved rather than created new (i.e., the XY_LINK won't match if you recalculate them but the FID will).