while(true){ //<=実際には何かしらの条件
    /*何らかの処理、ただし、hwndのテキストはコード側ではいじらない*/
    //hwnd<-対象のハンドル
    var sb = new StruingBuilder();
    var length = SendMessage(hwnd,WM_GETTEXTLENGTH,0,0);
    sb.Capacity = length+1; //追記2
    Console.WriteLine("before length:"+ length);
    Thread.Sleep(200);  //無くても同じ
    length = SendMessage(hwnd,WM_GETTEXT,length+1,sb);
    Console.WriteLine("before length:"+ length);
    /*何らかの処理、ただし、hwndのテキストはコード側ではいじらない*/
}

上記プログラムを実行すると

before length:212
after length:91

と何度もなってしまいます。
また、ターゲットのアプリケーションの最新版ではどの状況でも文字数が一致するのですが、古いバージョンでは上記のように一致する時としない時とあります。
どういった原因が考えられるでしょうか。以上、よろしくお願いいたします。

追記:
sbには実際の文字列が途切れて格納されていました。

追記2:
sbのCapacityは設定しておりましたが、転記ミスで抜けていました。せっかくご回答いただいたのに大変失礼いたしました。申し訳ございません。

追記3:
下記のように、試しに取得する長さを変更(length * 10)しましたが、得られる文字列はやはり途切れておりました。

while(true){ //<=実際には何かしらの条件
    /*何らかの処理、ただし、hwndのテキストはコード側ではいじらない*/
    //hwnd<-対象のハンドル
    var sb = new StruingBuilder();
    var length = SendMessage(hwnd,WM_GETTEXTLENGTH,0,0);
    sb.Capacity = length *10 +1;
    Console.WriteLine("before length:"+ length);
    Thread.Sleep(200);  //無くても同じ
    length = SendMessage(hwnd,WM_GETTEXT,length *10 +1,sb);
    Console.WriteLine("before length:"+ length);
    /*何らかの処理、ただし、hwndのテキストはコード側ではいじらない*/
}