Definier Dir doch ein privates Boolean-Feld des Formulars, nennen wir es mal FChangedByCode oder so. Wenn Du also im Code den ItemIndex setzen willst, setzt Du dieses Feld auf true, machst Deine Änderungen und setzt es wieder auf false. Im EventHandler musst Du dann natürlich das Feld noch zusätzlich auswerten.
Delphi-Quellcode:
procedure TForm4.ListView1Changing(Sender: TObject; Item: TListItem; Change: TItemChange; var AllowChange: Boolean);
begin
AllowChange := (Change <> ctState) or FChangedByCode;
end;
Ungetestet, sollte aber funktionieren.