angular.module('drg.ngIncludeScope', [])
.directive( 'ngIncludeScope', function() {
    'use strict';

    return {
        restrict: 'A',
        link : function( scope, elem, attrs ) {
            scope.$watch( attrs.ngIncludeScope, function( newScope, oldScope ) {
                var key,
                    newKeys = Object.keys( newScope ),
                    oldKeys = Object.keys( oldScope );
                
                // update values
                for( key in newKeys ) {
                    key = newKeys[ key ];
                    if( newScope.hasOwnProperty( key ) ) {
                        scope[ key ] = newScope[ key ];
                    }
                }
                
                // remove old values
                for( key in oldKeys ) {
                    key = oldKeys[ key ];
                    if( typeof newScope[ key ] === 'undefined' ) {
                        delete scope[ key ];
                    }
                }
            }, true );
        }
    };
});

angular.module('drg.ngIncludeScope', [])
.directive( 'ngIncludeScope', function() {
    'use strict';

    return {
        restrict: 'A',
        link : function( scope, elem, attrs ) {
            var keys = [];
            scope.$watch( attrs.ngIncludeScope, function( newScope, oldScope ) {
                var key;
                
                keys = Object.keys( newScope );
                
                // set getters
                angular.forEach( keys, function(key) {
                    if( newScope.hasOwnProperty( key ) && angular.isUndefined( scope[ key ] ) ) {
                        Object.defineProperty( scope, key, { 
                            get: function() {
                                return !!~keys.indexOf( key ) ? scope.$eval( attrs.ngIncludeScope + "['" + key.replace("'", "\\'") + "']" ) : undefined;
                            }
                        } );
                    }
                } );
            } );
        }
    };
});

Simplify and make better :)
Simplify and make better :)

Removed deep watch because it broke on when using scopes. Instead it now sets a series of getters on the scope for each property found on the given scope. Also it's much more performant.