Что-то со всей вашей аппрохой кажется "выключенным":
public void subFormLauncher(object sender, SubForm f)
напоминает мне о событии (отправитель объекта), но это не выглядит так, как должно происходить событие.
Также довольно странно, что вы передаете Форму как параметр, тем более что вы над ней работаете. Вы помещаете это в передний план, если вы даете это, но если не вы создаете это экземпляр?
Существует довольно высокая вероятность того, что вы глубоко в проблеме XY здесь.
Вы не сможете обойтись без указания точного типа, который вы хотите создать. Одним из подходов может быть добавление некоторого общего в смесь:
public void subFormLauncher<T>(object sender, T f) where T : SubForm
{
if (f == null)
{
f = new T(this); // This line is problematic
f.Show();
}
else
{
if (!f.Visible)
{
f.Show();
}
f.Activate();
}
}