Ich vermute mal das Problem liegt eher daran, dass der Hintergrund mit WM_ERASEBACKGROUND gelöscht wird, oder reagierst du darauf nicht bzw. fängst das ab? Das jedenfalls merkt man vor allem als Flackern.
Warum du TForm nicht verwenden kannst, aber andere Teile der VCL verwenden kannst, ist mir zwar nicht wirklich klar, denn die gesamte VCL ist zunächst einmal nicht threadsicher. Und ich habe durchaus mit TForm und visuellen Komponenten in Verbindung mit Threads gearbeitet. Man muss lediglich aufpassen, wie man auf was zugreift (und ggf. eigene Komponenten ableiten, die den gewünschten Zugriff threadsicher erlauben).
Aber egal, darum gehts hier nicht, und wenns funktioniert ists ja auch gut so.
Aber warum nutzt du nicht wirklich für alles die Windows API? Ich meine, das würde deine Anwendung doch stark verkleinern und nebenbei vermutlich auch solche Probleme beheben. Denn wenn du non-VCL programmierst, dann musst du ja eine Nachrichtenschleife haben, die sämtliche Messages bekommt. Und da kannst du ja auf WM_PAINT und WM_ERASEBACKGROUND reagieren, wie du es für richtig hälst, in deinem Fall eben nur deinen Hintergrund zeichnen statt vorher eine z.B. weiße Hintergrundfläche zu zeichnen um den Hintergrund zu löschen.