Using search criteria in modifyEntrySources plugin
My solution, thanks to @carlcs:

public function modifyEntrySources(&amp;$sources, $context)
{
    $sources[] = array('heading' =&gt; Craft::t('Themes'));

    $themes = array(
        'THEME_FOO' =&gt; 'themeFoo',
        'THEME_BAR' =&gt; 'themeBar'
    );

    $criteria = craft()-&gt;elements-&gt;getCriteria(ElementType::Entry);
    $criteria-&gt;section = 'article';
    $articles = $criteria-&gt;find();

    foreach ($themes as $theme =&gt; $label)
    {
        // Loop through all articles and check if they contain the current theme.
        // If they do, add it to the ids array which we will later use to filter
        // just the articles with this theme.
        $ids = [];
        foreach ($articles as $article)
        {
            foreach ($article-&gt;theme as $articleTheme)
            {
                if ($articleTheme == $themes[$theme])
                {
                    array_push($ids, $article-&gt;id);
                    break;
                }
            }
        }

        $sources['theme:' . $label] = array(
            'label' =&gt; Craft::t('Theme') . ': ' . Craft::t($theme),
            'criteria' =&gt; array(
                'section' =&gt; 'article',
                'id' =&gt; $ids
            )
        );
    }
}


The PHP itself could be cleaned up, but this works for now.

Categories would probably have been a simpler solution had I gone for that originally.