Using ACL for event registration
You could apply the same techniques for event pages that are described for contribution pages here: Are private contribution pages a thing?.

EDIT: Actually that's only a piece of the puzzle, let me give an example (and make it CMS-agnostic).  Assuming you want to limit access to members of "Newsletter Subscribers"

function hook_civicrm_preProcess($formName, &amp;$form) {

  $redirectPath = 'home';  // set this to the url to redirect to if access is denied

  if ($formName == "CRM_Event_Form_Registration_Register") {
    $contactId = CRM_Core_Session::singleton()-&gt;getLoggedInContactID();
    $result = civicrm_api3('Contact', 'get', array(
      'group' =&gt; "Newsletter Subscribers",
      'id' =&gt; $contactId,
    ));
    if ($result['count'] === 0) {
      CRM_Utils_System::redirect($redirectPath);
    }
  }
}


Note: This will hide ALL event registrations.  You'll have to find a variable in the $form object to use to determine whether this code should run on a particular page and modify the if condition.