Anyway this is how I managed to do it:
Add an Application_Error method to Global.asax which directs the user to a known page:
protected void Application_Error(object sender, EventArgs e)
{
Response.Redirect("Default.aspx");
}
and configure IIS custom error page to direct to a non-existing page, this will show in the logs so choose something like /AttemptToAccess403.aspx.
When the server encounters a 403 it will look up the non-existing page which will cause an error in the application. This is caught via the Application_Error method and will direct the user to a valid page (Default.aspx). To the user this is invisible, however the server has logged the attempt to access a directory structure (403) as an attempt to access page /AttemptToAccess403.aspx and an error 403 is never propogated to the client and hence satisfies the security requirement.
Headers returned to the client:
(before)
HTTP/1.x 301 Moved Permanently
HTTP/1.x 302 Found
(after)
HTTP/1.x 200 OK
HTTP/1.x 200 OK
As for the initial 'security' concern....