che io sappia non c'è un metodo ricorsivo che ti permette di ciclare anche tra gli oggetti interni

prova questa

private Control FindControlRecursive(Control root, object obj)
{
if (root.GetType() == typeof(CheckBox))
{
return root;
}

foreach (Control c in root.Controls)
{
Control t = FindControlRecursive(c, obj);
if (t != null)
{
return t;
}
}

return null;
}

poi la richiami così

myCnt = FindControlRecursive(cnt, cbk);
if (myCnt != null)
{....