Проблема не в расчете базовой линии, а в том как рисуется текст на GDI+ и Direct2D. У шрифта есть еще свойство LineGap - это предлагаемое расстояние между строками. Как я понял, GDI+ не учитывает его при выводе первой строки, а Direct2D - учитывает. Т.е. при выводе текста на Direct2D он смещается на TTextMetric.tmExternalLeading.
Чтоб увидеть это - достаточно в Вашем примере поменять шрифт "Times New Roman" на какой-нибудь, где LineGap=0 (например "Tahoma", "Verdana" или "Segoe UI").