Index: src/wp-includes/default-filters.php
===================================================================
--- src/wp-includes/default-filters.php	(revision 34637)
+++ src/wp-includes/default-filters.php	(working copy)
@@ -201,7 +201,7 @@
 add_filter( 'xmlrpc_pingback_error',    'xmlrpc_pingback_error'               );
 add_filter( 'title_save_pre',           'trim'                                );
 add_filter( 'get_comment_metadata',     'wp_lazyload_comment_meta',     10, 2 );
-add_filter( 'get_term_metadata',        'wp_lazyload_term_meta',        10, 2 );
+add_filter( 'get_term_metadata',        'wp_lazyload_term_meta',        99, 2 );
 
 add_filter( 'http_request_host_is_external', 'allowed_http_request_hosts', 10, 2 );
 
Index: src/wp-includes/taxonomy-functions.php
===================================================================
--- src/wp-includes/taxonomy-functions.php	(revision 34637)
+++ src/wp-includes/taxonomy-functions.php	(working copy)
@@ -1581,19 +1581,34 @@
  * As a rule, term queries (`get_terms()` and `wp_get_object_terms()`) prime the metadata cache for matched terms by
  * default. However, this can cause a slight performance penalty, especially when that metadata is not actually used.
  * In the context of a `WP_Query` loop, we're able to avoid this potential penalty. `update_object_term_cache()`,
- * called from `update_post_caches()`, does not 'update_term_meta_cache'. Instead, the first time `get_term_meta()` is
- * called from within a `WP_Query` loop, the current function detects the fact, and then primes the metadata cache for
- * all terms attached to all posts in the loop, with a single database query.
+ * called from `update_post_caches()`, does not `update_termmeta_cache()`. Instead, the first time `get_term_meta()` is
+ * called from within a `WP_Query` loop, the current function detects the fact, and then primes the metadata cache.
  *
  * @since 4.4.0
  *
- * @param null $check   The `$check` param passed from the 'pre_term_metadata' hook.
+ * @param mixed $check   The `$check` param passed from the 'get_term_metadata' hook.
  * @param int  $term_id ID of the term whose metadata is being cached.
- * @return null In order not to short-circuit `get_metadata()`.
+ * @return mixed The original value of `$check`.
  */
 function wp_lazyload_term_meta( $check, $term_id ) {
 	global $wp_query;
 
+	// Skip if the call to `get_metadata()` will be short-circuited.
+	if ( null === $check ) {
+		prime_term_meta_cache( $wp_query );
+	}
+
+	return $check;
+}
+
+/**
+ * Prime the metadata cache for all terms attached to all posts in a WP_Query.
+ *
+ * @since 4.4.0
+ *
+ * @param WP_Query $wp_query Query object.
+ */
+function prime_term_meta_cache( $wp_query ) {
 	if ( $wp_query instanceof WP_Query && ! empty( $wp_query->posts ) && $wp_query->get( 'update_post_term_cache' ) ) {
 		// We can only lazyload if the entire post object is present.
 		$posts = array();
@@ -1628,8 +1643,6 @@
 			update_termmeta_cache( array_keys( $term_ids ) );
 		}
 	}
-
-	return $check;
 }
 
 /**
