試しに実装してみましたが、それほどパフォーマンスにもヒットしなさそうです。
ひとつ変なのは、GetTextExtentExPointWに長さ0を渡すと正しく処理されるのに、GetTextExtentExPointAに長さ0を渡すとエラーになることでしょうか。
もういっそのこと、Microsoft Layer for Unicodeを使うという手もありますね。なんだかあまりにも実績がなさそうで怖いですけど。
調べてみたところ原因がわかりました。ドキュメントによると、ANSIバージョンでの部分文字列の幅の配列は、対応する文字がDBCSの一部だった場合にはその文字全体の幅になることになっています。たとえば幅が6の等幅フォントの場合、「abcあいう」だったら「6 12 18 30 30 42 42 54 54」のようになるはずです。Windows 2000上でGetTextExtentExPointAを呼び出すと確かにこのとおりになります。ところが、Windows 98SE上で呼び出すと、「6 12 18 24 30 36 42 48 54 60」となってしまいます。このせいでUnicode文字列にあわせた部分文字列の幅を計算するところがおかしくなっていました。仕方がないので、一文字ずつIsDBCSLeadByteを呼び出して処理するようにしました。
しかし、MSがこんなバグに気づいていないとも思えないので、バグだけど互換性のために変更できなくなったということでしょうか。いずれにせよドキュメントに書いておいて欲しいものです。
プラグインを消したのが原因だったようです。今は直ってますね。