TSubclassOf は UClass 型に安全性を提供するテンプレート クラスです。例えば、デザイナーがダメージタイプを指定できる Projectile クラスを作成しているとします。タイプ UClass の UPROPERTY を作成して、デザイナーが常に UDamageType から派生したクラスをアサインしてくれるよう期待するか、もしくは TSubclassOf テンプレートを使って強制的に選択するようにします。次のサンプル コードでその違いが分かります。
/** type of damage */
UPROPERTY(EditDefaultsOnly, Category=Damage)
UClass* DamageType;
Vs.
/** type of damage */
UPROPERTY(EditDefaultsOnly, Category=Damage)
TSubclassOf<UDamageType> DamageType;
2 つ目の宣言で、プロパティの選択肢として UDamageType から派生したクラスのみをリストするように、エディタのプロパティ ウィンドウに指示しています。最初の宣言では、どの UClass も選択することができます。それを表した画像がこちらです。

StrategyGame の Projectile ブループリントからの画像です。
この UPROPERTY 安全性に加えて、C++ レベルでの型安全性も提供されています。互換性のない TSubclassOf タイプをお互いにアサインしようとすると、コンパイル エラーが発生します。汎用の Uclass をアサインしようとすれば、アサインメントが可能であることを検証するためにランタイム チェックが実行されます。ランタイム チェックが失敗すると、値が nullptr となります。
UClass* ClassA = UDamageType::StaticClass();
TSubclassOf<UDamageType> ClassB;
ClassB = ClassA; // Performs a runtime check
TSubclassOf<UDamageType_Lava> ClassC;
ClassB = ClassC; // Performs a compile time check