自己解決しました。
ゲーム機同時とかUIの生成時に
private void Start()
{
var mat = GetComponent<Image>().material;
mat.SetColor("MainColor", Color.white);
mat = Instantiate(mat);
}
こんな感じでInstantiate化してそれを変更すればよかったみたいです。
オブジェクトをRenderer.material.SetColorとかで個別にマテリアルの設定変えられるのって同じマテリアル割り当ててても
メッシュレンダラが勝手にインスタンス化してるみたいですね、Imageのマテリアルも同じようにしてくれてればいいものを・・・

>>564
Imageのカラーはソース画像のカラーを変更するもので、マテリアルの設定は関係ないみたいです。
そもそも動的なシェーダーつけたマテリアル操作とかもインスタンス化してないと個別に変更できないですし