Проблема в том, что TreeNode не имеет ни состояния Enabled, ни какого-либо события, которое вы можете задать. Таким образом, чтобы эмулировать состояние Enabled, вы можете использовать свойство Tag и сохранять логическое значение там при создании каждого узла.
Затем вы добавляете событие в TreeView.BeforeCheck и реализуете что-то вроде этого:
void TreeView_BeforeCheck(object sender, TreeViewCancelEventArgs e)
{
var IsReadOnly = e.Node.Tag as bool?;
if (IsReadOnly != null)
{
e.Cancel = IsReadOnly.Value;
}
}