Can I create a Usage Plan, attach it to a resource, without
associating an API Key to it? Will it work?
No, but based on your use case I think you want server-side throttling rather than per-client throttling. The docs outline the distinction:
Amazon API Gateway provides two basic types of throttling-related
settings:
Server-side throttling limits are applied across all clients. These limit settings exist to prevent your API—and your account—from being
overwhelmed by too many requests.
Per-client throttling limits are applied to clients that use API keys associated with your usage policy as client identifier.
Set server-side method throttling in AWS console
You can set default rate and burst limits for all methods per stage. In the AWS console, this can be done by going to Stages > your_stage > Settings > Default Method Throttling.

Set server-side method throttling in a Cloudformation template
I'm unable to figure out how to specify resource-specific throttles
programmatically.
See the below Cloudformation template snippet for creating a stage with method settings, from here:
Resources:
Prod:
Type: AWS::ApiGateway::Stage
Properties:
StageName: Prod
Description: Prod Stage
RestApiId: !Ref MyRestApi
DeploymentId: !Ref TestDeployment
DocumentationVersion: !Ref MyDocumentationVersion
ClientCertificateId: !Ref ClientCertificate
Variables:
Stack: Prod
MethodSettings:
- ResourcePath: /
HttpMethod: GET
MetricsEnabled: 'true'
DataTraceEnabled: 'false'
- ResourcePath: /stack
HttpMethod: POST
MetricsEnabled: 'true'
DataTraceEnabled: 'false'
ThrottlingBurstLimit: '999'
- ResourcePath: /stack
HttpMethod: GET
MetricsEnabled: 'true'
DataTraceEnabled: 'false'
ThrottlingBurstLimit: '555'