Staff restricted by ACLs cannot use/see any other groups
The core issue is that CiviCRM's in-built ACLs don't distinguish between access to view a group and access to view the group's contacts.

However, extension-based ACLs CAN distinguish.  So my solution is to give folks access to "View All Groups" as a web-based ACL, then restrict permissions by extension.

Note that this doesn't work unless you've applied the patch for core#580.  This will be part of CiviCRM 5.12+. 

UPDATE: Here's an example where I limit the viewing of anonymous donors (as flagged by a custom field) to members of a group called "Confidential Staff":



function tweaks_civicrm_aclWhereClause($type, &amp;$tables, &amp;$whereTables, &amp;$contactID, &amp;$where) {
  // If the person is not in the "Confidential Staff" group, don't show them the contacts in the "Anonymous Donors" group.
  if (!$contactID) {
    return;
  }
  $confidentialStaff = civicrm_api3('GroupContact', 'get', [
    'group_id' =&gt; "Confidential_Staff_14",
    'contact_id' =&gt; $contactID,
  ]);
  // If this person is not confidential staff;
  if ($confidentialStaff['count'] === 0) {
    // Find a list of anonymous donors.
    $result = civicrm_api3('Contact', 'get', [
      'return' =&gt; ["id"],
      'custom_12' =&gt; 1,
    ]);
    $anonDonors = array_keys($result['values']);
    $anonDonors = implode(",", $anonDonors);
    $where .= ($where ? ' AND ' : '') . " contact_a.id NOT IN ($anonDonors)";
  }
}