Could try this.
var base:String = unescape( LoaderInfo( this.root.loaderInfo ).url ); // url of SWF
// now we need to remove the SWF name from the url
var lastSlash:uint = Math.max( this.base.lastIndexOf( "\\" ), this.base.lastIndexOf( "/" ) );
return( base.substr( 0, lastSlash + 1 ) );
That will take the url of the SWF, loop through it and find the last "\" or "/" to determine where the swf file name starts, and set the base equal to the path of the SWF.
And then change all relative URLRequests from
var url:URLRequest = new URLRequest( "assets/blah/blah/img.png" );
to
var url:URLRequest = new URLRequest( base + "assets/blah/blah/img.png" );
This would be something I would add as a static property of your application class so that you are only accessing a string and not doing any casting or unicode escaping or anything repeatedly. Just run it once at start up and throw it as a static var because it will never change.
(I did test this and it works, at least locally. I see no reason why it would behave any differently with a URL from the web, however)