It's easy to set site collection in read-only (or hide it). "Central Admin" -> "Application Management" -> "Site Collections" -> "Configure quotas and locks" -> "Site Lock Information".
However, is there a way to set a sub site to read-only?
Yes. Kind of. But it cannot be done in "one click".
Below is the procedure.
1. Go to the sub site;
2. "Site Actions" -> "Site Permissions";
3. Break the permissions inheritance;
4. "Permissions Levels";
5. Take screenshot of the current permission levels settings;
6. Tick the user groups we used, then leave "Read" or "View Only" rights with those user groups.
Later on, if we need to restore the permission settings of that sub site, we can restore it follow the screenshot from step 5.
To hide a sub site, we need to revoke all access rights from those user groups as the screenshot below.
Is this solution good enough? Please let me know your thoughts.