The title of your question only makes a distinction for "anonymous" users; the question itself mentions "Member-only" vs "public".
If by "Member" you mean "current membership holders as defined in CiviMember", then the Member Only Event extension is probably a good choice.
If on the other hand you only mean "members of my site" a.k.a. "logged in users", then what you're describing is possible with ACLs. The following will default to "authenticated users only" for all events, with exceptions defined on a per-event basis using ACLs.
Configure Drupal (or other CMS) permissions to deny the "CiviEvent: register for events" permission for the Anonymous role, and grant this permission to the Authenticated role.
In CiviCRM, create an ACL that grants "Edit" permission to a single event for the "Everyone" role, as in this example:
Naturally you'll want to test that event and a normal "authenticated user only" event, both as an authenticated user and as an anonymous user, for your own peace of mind that it's configured correctly.
An important caveat here is that with ACLs you are introducing a separate mechanism for managing user permissions, which runs parallel with -- and sometimes overlaps with -- Drupal permissions. That's not a bad thing; it just means it's important to a) have a clear understanding of what you're enabling, b) test to ensure you've configured it correctly, and c) remember to check ACLs as well as Drupal permissions, if you ever find an issue later on where users have different access levels than you expected.