Is there a better way to get a child?
I don't like a class that's just called Helpers - that's generally a code smell, something that ends up a big dumping ground for anything that doesn't quite fit anywhere else. Be more specific when naming things, perhaps VisualHierarchyHelper would be a better name?
I'm using a very similar method - the main difference is essentially the number ot return statements, and the childName parameter; I found this code on Stack Overflow a little while ago:
    /// &lt;summary&gt;
    /// Finds a Child of a given item in the visual tree. 
    /// &lt;/summary&gt;
    /// &lt;param name=&quot;parent&quot;&gt;A direct parent of the queried item.&lt;/param&gt;
    /// &lt;typeparam name=&quot;T&quot;&gt;The type of the queried item.&lt;/typeparam&gt;
    /// &lt;param name=&quot;childName&quot;&gt;x:Name or Name of child. &lt;/param&gt;
    /// &lt;returns&gt;The first parent item that matches the submitted type parameter. 
    /// If not matching item can be found, 
    /// a null parent is being returned.&lt;/returns&gt;
    /// &lt;remarks&gt;
    /// https://stackoverflow.com/a/1759923/1188513
    /// &lt;/remarks&gt;
    public static T FindChild&lt;T&gt;(this DependencyObject parent, string childName)
       where T : DependencyObject
    {
        if (parent == null) return null;

        T foundChild = null;

        var childrenCount = VisualTreeHelper.GetChildrenCount(parent);
        for (var i = 0; i &lt; childrenCount; i++)
        {
            var child = VisualTreeHelper.GetChild(parent, i);
            var childType = child as T;
            if (childType == null)
            {
                foundChild = FindChild&lt;T&gt;(child, childName);
                if (foundChild != null) break;
            }
            else if (!string.IsNullOrEmpty(childName))
            {
                var frameworkElement = child as FrameworkElement;
                if (frameworkElement != null &amp;&amp; frameworkElement.Name == childName)
                {
                    foundChild = (T)child;
                    break;
                }
            }
            else
            {
                foundChild = (T)child;
                break;
            }
        }

        return foundChild;
    }

Notice the guard clause preventing a NullReferenceException that your method would throw if obj was null. I think this is a pretty neat way of finding a child node in the visual tree.
That said, it might be personal preference, but I think the readability of your code could benefit from implicit typing (var), especially in cases like this where the type is already pretty obvious:
TabItem ti = tabControl.ItemContainerGenerator.ContainerFromItem(customTabItem) as TabItem;
Popup popup = (Helpers.FindVisualChild&lt;Popup&gt;(ti) as Popup);
ImageColorPicker icp = (popup.Child as StackPanel).Children[0] as ImageColorPicker;

Becomes:
var ti = tabControl.ItemContainerGenerator.ContainerFromItem(customTabItem) as TabItem;
var popup = (Helpers.FindVisualChild&lt;Popup&gt;(ti) as Popup);
var icp = (popup.Child as StackPanel).Children[0] as ImageColorPicker;

And here you would have to make sure popup isn't null before accessing its Child member, if you want to avoid that possible NullReferenceException.
Also, you're casting too much - T should be of the type you've specified, so the return type of FindChild&lt;ImageColorPicker&gt; is ImageColorPicker, casting it to ImageColorPicker is redundant.

Update
The ImageColorPicker child has a Popup parent, which has a StackPanel parent, which has a Grid parent, which has a TabItem parent.
You're not fully using the recursiveness of your function when you're getting the color picker. I'd believe you could get it like this:
var tab = tabControl.ItemContainerGenerator.ContainerFromItem(customTabItem) as TabItem;
var picker = VisualHierarchyHelper.FindChild&lt;ImageColorPicker&gt;(tab, &quot;ColorPicker&quot;);

That should work, because the search is recursive; you don't need to get everything in-between.