I know it was a long time ago that you wrote this request, but didn't notice until now, atleast i wrote a textwrapper using a TCanvas and i guess you could use that. It's quite fast, more or less O(N) where N is the length of the text. TextOut is called once per line and textWidth once per word. No costly copy, Length etc as everything is managed on a char to char basis.

It works opposite to yours, starts from the begining and extracts one word from the text. Each word is then added to the line if the line + the word fits within the maximum width.


Code:
Procedure DrawText(Canvas: TCanvas; Text: String; Width, Height: Integer);
var Char: PChar;
var Last: PChar;
var Seperator: System.Char;

var Line: String;
var Word: String;
var X, Y : Integer;

var SpaceWidth: Integer;
var LineHeight: Integer;
begin
  Char:=@Text[1];
  Line:='';
  Word:='';

  SpaceWidth:= Canvas.TextWidth (' ');
  LineHeight:= Canvas.TextHeight(' ');

  X:=0;
  Y:=0;
  while Char^ <> #0 do begin
    // Start of new line
    while Char^ <> #0 do begin
      // Save the current position
      Last&#58;=Char;
      // Reset the word
      Word&#58;='';
      // Get a new word
      while not &#40;Char^ in &#91;#0, #32, #13, ',', '.'&#93;&#41; do begin
        Word&#58;=Word + Char^;
        Inc&#40;Char&#41;;
      end;
      Seperator&#58;=Char^;

      // Add the word's width to the line
      Inc&#40;X, Canvas.TextWidth&#40;Word&#41;&#41;;
      // Check if the word fits within the width
      If X >= Width then begin
        // Skip the last word.
        Char&#58;=Last;
        // Print the text
        Canvas.TextOut&#40;0,Y, Line&#41;;
        // Reset the line
        Line&#58;='';
        // Reset the line's width
        X&#58;=0;
        // Increase our vertical position
        Y&#58;=Y + LineHeight;
        // Check if the next line will reach the vertical limit
        IF Y + LineHeight >= Height then Exit;
        // Exit the line loop
        Break;
      end;
      // Special case if we reached the end of the text
      IF Char^ = #0 then begin
        Canvas.TextOut&#40;0,Y, Line + Word&#41;;
        Exit;
      end;
      // Add the word and a space to the line
      Line&#58;=Line + Word + Seperator;
      // Add the space's width
      Inc&#40;X, SpaceWidth&#41;;
      // Skip the space
      Inc&#40;Char&#41;;
    end;
  end;
  Canvas.TextOut&#40;0,Y, Line&#41;;
end;
Edit: Typos