I have a very simple AJAX function that works fine when logged in as admin, but when logged in as a subscriber the call to admin-ajax.php returns a html page with the header and footer of my theme, and that's it.
By doing some wolf fencing I've tracked it down to line 37 of admin-ajax.php do_action( 'admin_init' );. It gets there and just returns.