Leads are normally "hidden" when converted, but if you wanted to do this purely through sharing, here's how you might go about it.
Org-Wide Defaults: Private
To hide anything, you first have to hide everything, then show things. So, in the first step, you'll need to make all leads private. This is found in Setup > Security Controls > Sharing Settings.
Public Groups
To share leads with most everyone, you may want to set up a public group. This is found in Setup > Manage Users > Public Groups. If the goal is still to generally allow everyone access to all leads that are not to be hidden, you can use the default group Entire Organization.
Criteria-Based Sharing
To share leads that do not meet the Customer Status, go back to Sharing Settings, and create a new Criteria-Based Lead Sharing Rule. The rule should be the inverse of what you're trying to hide, so it should look like this:
Lead Status not equal to Customer
System Administrators already have automatic, unlimited access to all leads, so there's no need to include that as a criteria.
Lead Ownership
Finally, leads are always visible to the owner of the lead, so the final step is to assign ownership of the lead to a System Administrator when the status reaches Customer. To do this, you might use a trigger, flow, or workflow rule. As a trigger, it might look like this:
trigger changeToSysAdmin on Lead (before insert, before update) {
Lead[] newCustomers = new Lead[0];
for(Lead record: Trigger.new) {
if(record.Status == 'Customer') {
newCustomers.add(record);
}
}
if(!newCustomers.isEmpty()) {
User someAdmin = [SELECT Id FROM User WHERE Profile.Name='System Administrator' AND IsActive = TRUE LIMIT 1];
for(Lead record: newCustomers) {
record.OwnerId = someAdmin.Id;
}
}
}
You could also build this as a Flow, and then attach a Process Builder action to the flow to assign ownership.