How can customers choose online vs on-site appointments?

Customers aren't able to choose this through the booking form.

This needs to be configured per service. If you configured Google Meet, or Zoom integration, and you linked your employee to his/hers Google Calendar and/or Zoom profile, the employee will be assigned to an online location. If you enable Google Meet in Settings/Integrations/Google Calendar, the employee will automatically be providing an online appointment. In order to provide the link to the customer, you need to add the %google_meet_url% placeholder to the email template(s) sent to the customer.

As for Zoom, when you're editing the service (in the Settings of the service), you can enable the "Zoom Integration". When you do that, this service will be offered online and your customers wouldn't be able to choose whether it's going to be an online or an offline appointment.

The only way to do it would be to create 2 services (one where Zoom would be enabled, and another one where it will be disabled), so when a customer books one service, the 2nd service will not be available.