Yes,
The caret or selstart reports wrong.
Assume '12💓💔';
Starting from left it returns 1,2,4,6 instead of 1,2,3,4
There's nothing wrong with that.
WinAPI assumes code units, not code points.
Let's go from left to right:
SelStart=0
'1', +1 codeunit, SelStart=1
'2', +1 codeunit, SelStart=2
'💓', +2 codeunit (1 codepoint), SelStart=4
'💔', +2 codeunit (1 codepoint), SelStart=6
Moreover, you can move SelStart inside codepoint by program: SelStart := 3. But it will look strange.
When typing directly, memo does not allow such things and moves the cursor exclusively over codepoint positions.
Edit:
When you type text directly, the memo moves cursor through the glyphs. Code points can be combined (up to 3) into one glyph (visible character).
In the case of 3 code points, it will be 6 code units (SelStarts) or 12 bytes per one character!