wp_ajax_nopriv_xxx is not firing on one site, works on all others. -1 for logged out users

The condition for such hook to fire is quite simple, as per admin-ajax.php:

if ( !empty( $_REQUEST['action'] ) )
    do_action( 'wp_ajax_nopriv_' . $_REQUEST['action'] );

So the likely reasons are:

  1. You script does not pass action name properly (which is unlikely if exactly same code works for logged in user).
  2. Action name gets messed up in WordPress by something and it somehow depends on user being logged in.

I’d try to hook into admin_init and dump all of $_REQUEST.