I wrapped this up in a mixin which has a showWidget method which internally calls methods to handle both the sidebar controller in the tab theme and the header controller in the foldable theme. I haven't tested in other themes yet. I found similar issues to my original question with the header controller in the foldable theme.
In the feature action onExecute method you can call this.showWidget() to handle updating the sidebar or header controller, handling updating the highlight and selected tabs etc.
onExecute: function(featureSet){
WidgetManager.getInstance().triggerWidgetOpen( this.widgetId )
.then( lang.hitch( this, function ( myWidget ) {
/* do something */
this.showWidget();
}));
}
Hope someone finds this useful!