The problem is that the arrow is by default connected to the center of the text.
You may however change the position to which the arrow connects using the relpos argument of the arrowproperties.
plt.annotate(..., arrowprops=dict(..., relpos=(0, 0)) )
The relative position is specified in coordinates of the text's bounding box.

For bottom aligned text, one would choose relpos=(0,0).
For center aligned text, one would choose relpos=(0,0.5).
For top aligned text, one would choose relpos=(0,1).
A problem is, if the text does not contain any character (like the "g" here), which goes down to the bottom, then a relpos=(0,0.2) might make sense.
Example:
import matplotlib.pyplot as plt
fig, ax = plt.subplots(1, dpi=200)
ax.grid(color='k', alpha=0.5, ls=':')
plt.annotate('Head Motion Cutoff',
xy=[0.1, 0.8],
xytext=[60, 0],
verticalalignment = "baseline",
arrowprops=dict(arrowstyle='simple',
fc='#A9A9A9', ec='#A9A9A9',
shrinkA=4, shrinkB=4,
relpos=(0, 0.2)),
fontsize=11,
textcoords="offset points")
ap = dict(fc='#A9A9A9', ec='#A9A9A9', arrowstyle='simple',
shrinkA=4, shrinkB=4)
fontsize = 11
aligns = ["bottom", "top", "center"]
positions = [dict(relpos=(0, 0.)),dict(relpos=(0, 1)),dict(relpos=(0, 0.5))]
kw = dict(fontsize=fontsize, textcoords="offset points")
for i, (align,pos) in enumerate(zip(aligns,positions)):
ap.update(pos)
kw.update(dict(arrowprops=ap))
plt.annotate('Head Motion Cutoff (va={})'.format(align),
xy=[0.1, i*0.2+0.2],
xytext=[60, 0],
va=align, ha="left", **kw)
plt.show()
