Jeff,
From a "GDC point of view", this is unfortunately expected: cbPaste pastes the clipboard in the current field (i.e. the widget associated to the Node pointed by UserInterface.focus) if the field is "pastable" (a Menuaction can get the focus but can't be "pasted").
ON ACTION myaction
IF ( INFIELD(myfield) )
THEN
CALL my_menu() RETURNING lv_string
CALL ui.Interface.frontCall("standard","cbset",[lv_string],[lv_result])
CALL ui.Interface.frontCall("standard","cbpaste",[],[lv_result])
END IF
my_menu() creates a menu which changes the focused node (the focus goes to one of the menu items). Then, when my_menu is closed and you call the frontCall, the focused node does not exists anymore ; then the runtime system set the focus to the fallback node, i.e. the UserInterface:
om 14 { {rn 106} {an 0 FunctionCall 111 { {isSystem "0"} {moduleName "standard"} {name "cbset"}
{paramCount "1"} {returnCount "1"}} { {FunctionCallParameter 112 { {dataType "STRING"} {isNull "0"} {value "bar"}}
{}}}} [b]{un 0 { {focus "0"}}}[/b]}
cbPaste will then do nothing because the focused node is a not a "pastable" field ; the same in the BEFORE FIELD: you're not in the field, you are BEFORE the field. Out of my head I see no clean and quick solution, I just wanted to explain you the behavior.
Regards,