SVG-картинкой или двумя текстовыми блоками поверх друг друга на absolute и через маску обрезать верхний блок. Либо же градиент на текст в качестве заливки + text-stroke.
А дальше уже только JS и подстройка градиента с его помощью на основе позиции курсора и картинки позади, если есть такая задача. К CSS это не имеет отношения.
Тот же механизм применим и к варианту с маской (два блока на absolute). Наверное, так будет даже проще, ибо позицию маски полегче интерпретировать.
Update.
Там даже проще. Блок с прозрачным текстом, блок с картинкой, блок с белым текстом. Вот в таком порядке. Без масок и градиента.