※2022/04時点の素人の個人的な意見です。ご指摘大歓迎です。
※Blueprint Onlyの話です。
データテーブルの依存を切る
データテーブルは変数としてスポーン時のパラメータに出来るので、そこで構造体だけの依存に切り離せます。

なので、自分はレベル用の管理アクター(と言っても肥大化しないように注意)を配置して、データテーブルをスポーンの変数にして、そのアクターに保持、アクターコンポーネントなどに機能とその変数を移してGetはそこを経由してもらう。管理アクターはアクターとして抽象化してGameModeなどに保持。
すると、依存はアクターコンポーネントと構造体と管理アクターだけになります。
追記:2023/04/02
あと、サブクラスに依存オブジェクトを参照させる方法があります。
スーパークラス >>> サブクラス -> 依存オブジェクト -> スーパークラス
のような関係であれば、スーパークラスが派生クラスを参照していないので
依存オブジェクトはスポーンパラメータにするなり、メソッドはオーバーライドするなりすればOKだと思います。
スーパークラスにオブジェクト型で保持させて、サブクラスでキャストするとか。
循環参照を検知するには、以下のようなプラグインも存在します。
とはいえ、個人的に有料プラグインでも循環しているものも確認していますし、循環自体がどのような問題を引き起こすのか全体像は分かりかねます。
GUIの依存を切る(画面と機能の分離)
同じ機能でデザインだけ変えたい時など、BlueprintWidgetに直接ロジックを書くと変更に弱いので分離した方がいいと思ってます。
(機能とデザインが一緒だと、それに結びついているテクスチャとかマテリアルまで移行してしまうなど)
外部からバインドなどをするオブジェクトが必要なのですが、
ObjectだとC++をいじらないと自由度上がらないので、BlueprintWidget管理用のアクターを作ります。
何でActorなんだYO
素人の自分の場合、現時点でBlueprint Onlyだと拡張性を考えるとアクターになりました。
トランスフォームは不要ですが、スポーンのパラメータ指定ができて、タイムラインが使えて、オブジェクト・ウィジェットが作成できる。
ActorComponent、Objectの制約とか、何であるんだろう?
設計思想がイマイチ分からないです。
どこかに載ってないかな。