Does theme.json get cached? How can I clear it?

The answer is yes, it does get cached. I think the transient should get cleared when the theme is changed but that’s not working in my local environment, I will have to dig into that another day.

From the function wp_get_global_stylesheet:

// Return cached value if it can be used and exists.
// It's cached by theme to make sure that theme switching clears the cache.
$can_use_cached = (
    ( empty( $types ) ) &&
    ( ! defined( 'WP_DEBUG' ) || ! WP_DEBUG ) &&
    ( ! defined( 'SCRIPT_DEBUG' ) || ! SCRIPT_DEBUG ) &&
    ( ! defined( 'REST_REQUEST' ) || ! REST_REQUEST ) &&
    ! is_admin()
);

Adding

define( 'SCRIPT_DEBUG', true );

To my local wp-config.php file is working for now…