elementFromPoint очевидно получает элемент. Вообще этот метод оправдан в единичных случаях, и я сомневаюсь ваш именно такой. Тем не менее elementFromPoint возвращает самый последний в иерархии элемент, потому соответствующую текстноду получить проблем никаких нет, просто взять firstChild:
var textNode = document.elementFromPoint(x, y).firstChild;
//если первый элемент не текстнода, значит точка где-то далеко от текста, возвращаем null.
if(textNode && textNode.nodeType !== 3) textNode = null;
//тут можно добавить для надёжности функцию, что до определённого предела будет двигать точку вверх-вниз, пока не найдёт таки текст
Какие-то проблемы требующие извращений могут возникнуть если текстноды добавлялись скриптом через createTextNode(), т.е. в одном элементе несколько текстнод подряд. Впрочем тоже решаемо: если все добавленные тексноды можно считать как одну, то поможет применение elem.normalize(), иначе если каждая подобная нода важна(сооовсем уж извращённый вариант) то можно понаркоманить с помощью Range и getClientRects().