Edit based on comments:
Here are the results of turning off seq_scans and io timing on
Limit (cost=149630.09..149634.34 rows=100 width=1639) (actual time=547.957..547.957 rows=0 loops=1)
Buffers: shared hit=225599
-> Unique (cost=149630.09..151002.20 rows=32285 width=1639) (actual time=526.203..526.204 rows=0 loops=1)
Buffers: shared hit=225599
-> Sort (cost=149630.09..149710.80 rows=32285 width=1639) (actual time=526.192..526.193 rows=0 loops=1)
Sort Key: events.block_number, events.transaction_index, events.transaction_hash, events.log_index, events.event_id, events.block_hash, events.address, events.return_values, events.event, events.signature, events.raw, events.processing_error, events.confirmations, events.created_at, events.updated_at, events.id
Sort Method: quicksort Memory: 25kB
Buffers: shared hit=225599
-> Gather (cost=1000.86..124259.17 rows=32285 width=1639) (actual time=526.164..545.039 rows=0 loops=1)
Workers Planned: 2
Workers Launched: 2
Buffers: shared hit=225599
-> Nested Loop (cost=0.85..120030.67 rows=13452 width=1639) (actual time=505.207..505.208 rows=0 loops=3)
Buffers: shared hit=225599
-> Parallel Index Scan using events_status_index on events (cost=0.43..46843.84 rows=13804 width=1639) (actual time=12.540..58.632 rows=17030 loops=3)
Index Cond: (status = 'Waiting'::event_status)
Filter: ((event)::text = ANY ('{RecordUpdated,RecordDiscovery,RecordRetrieval}'::text[]))
Rows Removed by Filter: 1
Buffers: shared hit=21233
-> Index Scan using records_pkey on records (cost=0.43..5.30 rows=1 width=44) (actual time=0.024..0.024 rows=0 loops=51091)
Index Cond: ((guid)::text = (events.return_values #>> '{guid}'::text[]))
Filter: (status = 'Mined'::record_status)
Rows Removed by Filter: 1
Buffers: shared hit=204366
Planning Time: 0.410 ms
JIT:
Functions: 41
Options: Inlining false, Optimization false, Expressions true, Deforming true
Timing: Generation 7.868 ms, Inlining 0.000 ms, Optimization 2.929 ms, Emission 55.472 ms, Total 66.269 ms
Execution Time: 570.247 ms