If I ignore your rather bizarre test and use something simpler I can't see anything wrong.
tbx.Click += new EventHandler(WhereIsTheCaret_Click);
private void WhereIsTheCaret_Click(object sender, EventArgs e) {
Point p;
GetCaretPos(out p);
Debug.Print("Caret {0}, Index {1} IndexPos {2}",
p, tbx.SelectionStart, tbx.GetPositionFromCharIndex(tbx.SelectionStart));
}
Wherever I click in a multiline TextBox the value of the Point obtained either from GetCaretPos or from the Selection are the same.
Alan.