You can inject and use $timeout without a delay to put the action at the end of the browser event queue (after the rendering engine):
app.directive('select', function($timeout) {
return {
restrict: 'E',
link: function(scope, elm, attrs) {
$timeout(function() {
$(elm).chosen({
disable_search: true
});
});
}
};
});
Note that this case is assuming the data for ngOptions is available at initialization and not retrieved asynchronously.