Reviving this very old thread as I needed to do this, and found a way (perhaps this has been solved previously, but I couldn't find it in a search of the group)
It uses an OSC cue which uses an OSC query to get the height of each text cue and stores this in it's notes field for this script to process:
set theSurfaceHeights to 400 --Height in Pixels of title output surface
tell application id "com.figure53.QLab.4" to tell front workspace
set theCues to cues of front cue list whose q type is "text"
repeat with eachcue in theCues
set the text alignment of eachcue to "left"
--calculate Y position
set the custom message of cue "TEMPEN" to "/cue/TEMPEN/notes \"#/cue_id/" & (uniqueID of eachcue) & "/text/outputSize#\""
start cue "TEMPEN"
set theTextHeight to paragraph 3 of (notes of cue "TEMPEN" as string)
set the translation y of eachcue to theSurfaceHeights / 2 - theTextHeight / 2
end repeat
end tell
You can easily adapt the maths to align to the bottom of the surface if required.
Workspace and screen recording attached.