前に書いてあった、Unityシェーダーに個別属性を設定することですが、「UIもshaderで盛る! 〜 shaderとanimationで作るリッチなUI演出」という記事を見て解決策を見つけました。要は、対象となるUIのスクリプトにIMaterialModifierを実装すること。
しかし、コードを見ると結局はマテリアルを生成することになるので、ボタンでは効率が悪い。確かに解決は解決しましたが、対象UIを増やすとSet Pass Callも同時に増えるので、やはり向いてなかった。
結局パフォーマンスを考慮すると、シェア可能のシェーダーを設計するべきだった。