In effetti no, perché OnCustomDrawItem viene chiamata ogni volta che un item ha bisogno di essere ridisegnata (tipo quando ridimensioni il form). Nel tuo primo caso, ad ogni ridisegno di ogni singolo item viene assegnato un colore random, quindi il fatto che i colori cambino è del tutto normale; la stessa cosa nel tuo secondo caso, dove assegni ad ogni item ridisegnata lo stesso colore.
Il problema è che la listview non ha un canvas per ogni singolo item della lista, ma devi cambiare il colore del canvas della listview a seconda dell'item. In pratica una cosa del tipo:
procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
with ListView1.Canvas.Brush do
begin
case Item.Index of
0: Color := $FF0000;
1: Color := $00FF00;
2: Color := $0000FF;
end;
end;
end;