diff --git src/wp-includes/class-wp-user-query.php src/wp-includes/class-wp-user-query.php
index 02cae10..c6ab3ff 100644
--- src/wp-includes/class-wp-user-query.php
+++ src/wp-includes/class-wp-user-query.php
@@ -554,8 +554,11 @@ class WP_User_Query {
 
 			$this->results = $r;
 		} elseif ( 'all' == $qv['fields'] ) {
+			$caps = $this->get_caps( $qv['blog_id'] );
+
 			foreach ( $this->results as $key => $user ) {
-				$this->results[ $key ] = new WP_User( $user, '', $qv['blog_id'] );
+				$user_caps = isset( $caps[ $user->ID ] ) ? $caps[ $user->ID ] : null;
+				$this->results[ $key ] = new WP_User( $user, '', $qv['blog_id'], $user_caps );
 			}
 		}
 	}
@@ -720,6 +723,32 @@ class WP_User_Query {
 	}
 
 	/**
+	 * Fetch site caps for all matched users.
+	 *
+	 * @since 4.6.0
+	 *
+	 * @param int $blog_id ID of the blog to fetch caps for.
+	 * @return array Caps, keyed by user ID.
+	 */
+	protected function get_caps( $blog_id ) {
+		global $wpdb;
+
+		$caps = array();
+
+		$cap_key = $wpdb->get_blog_prefix( $blog_id ) . 'capabilities';
+		$id_list = implode( ',', array_map( 'intval', wp_list_pluck( $this->results, 'ID' ) ) );
+		if ( $id_list ) {
+			$results = $wpdb->get_results( $wpdb->prepare( "SELECT user_id, meta_value FROM $wpdb->usermeta WHERE user_id IN ($id_list) AND meta_key = %s ORDER BY user_id ASC", $cap_key ) );
+
+			foreach ( $results as $result ) {
+				$caps[ (int) $result->user_id ] = maybe_unserialize( $result->meta_value );
+			}
+		}
+
+		return $caps;
+	}
+
+	/**
 	 * Make private properties readable for backwards compatibility.
 	 *
 	 * @since 4.0.0
diff --git src/wp-includes/class-wp-user.php src/wp-includes/class-wp-user.php
index 210919d..86919f1 100644
--- src/wp-includes/class-wp-user.php
+++ src/wp-includes/class-wp-user.php
@@ -107,15 +107,18 @@ class WP_User {
 	 * Retrieves the userdata and passes it to WP_User::init().
 	 *
 	 * @since 2.0.0
+	 * @since 4.6.0 Added `$raw_caps` parameter.
 	 * @access public
 	 *
 	 * @global wpdb $wpdb WordPress database abstraction object.
 	 *
-	 * @param int|string|stdClass|WP_User $id User's ID, a WP_User object, or a user object from the DB.
-	 * @param string $name Optional. User's username
-	 * @param int $blog_id Optional Site ID, defaults to current site.
+	 * @param int|string|stdClass|WP_User $id       User's ID, a WP_User object, or a user object from the DB.
+	 * @param string                      $name     Optional. User's username
+	 * @param int                         $blog_id  Optional Site ID, defaults to current site.
+	 * @param array                       $raw_caps Optional. Capabilities data. If present, this data will be
+	 *                                              used to populate site caps, instead of querying for usermeta.
 	 */
-	public function __construct( $id = 0, $name = '', $blog_id = '' ) {
+	public function __construct( $id = 0, $name = '', $blog_id = '', $raw_caps = null ) {
 		if ( ! isset( self::$back_compat_keys ) ) {
 			$prefix = $GLOBALS['wpdb']->prefix;
 			self::$back_compat_keys = array(
@@ -129,10 +132,10 @@ class WP_User {
 		}
 
 		if ( $id instanceof WP_User ) {
-			$this->init( $id->data, $blog_id );
+			$this->init( $id->data, $blog_id, $raw_caps );
 			return;
 		} elseif ( is_object( $id ) ) {
-			$this->init( $id, $blog_id );
+			$this->init( $id, $blog_id, $raw_caps );
 			return;
 		}
 
@@ -148,7 +151,7 @@ class WP_User {
 		}
 
 		if ( $data ) {
-			$this->init( $data, $blog_id );
+			$this->init( $data, $blog_id, $raw_caps );
 		} else {
 			$this->data = new stdClass;
 		}
@@ -157,14 +160,17 @@ class WP_User {
 	/**
 	 * Sets up object properties, including capabilities.
 	 *
-	 * @param object $data    User DB row object.
-	 * @param int    $blog_id Optional. The site ID to initialize for.
+	 * @since 4.6.0 Added `$raw_caps` parameter.
+	 *
+	 * @param object $data     User DB row object.
+	 * @param int    $blog_id  Optional. The site ID to initialize for.
+	 * @param array  $raw_caps Optional. Array of site capabilities. If absent, will be fetched from usermeta.
 	 */
-	public function init( $data, $blog_id = '' ) {
+	public function init( $data, $blog_id = '', $raw_caps = null ) {
 		$this->data = $data;
 		$this->ID = (int) $data->ID;
 
-		$this->for_blog( $blog_id );
+		$this->for_blog( $blog_id, $raw_caps );
 	}
 
 	/**
@@ -441,12 +447,14 @@ class WP_User {
 	 *
 	 * @access protected
 	 * @since 2.1.0
+	 * @since 4.6.0 Added `$raw_caps` parameter.
 	 *
 	 * @global wpdb $wpdb WordPress database abstraction object.
 	 *
-	 * @param string $cap_key Optional capability key
+	 * @param string $cap_key  Optional capability key
+	 * @param array  $raw_caps Optional. Array of site capabilities. If absent, will be fetched from usermeta.
 	 */
-	protected function _init_caps( $cap_key = '' ) {
+	protected function _init_caps( $cap_key = '', $raw_caps = null ) {
 		global $wpdb;
 
 		if ( empty($cap_key) )
@@ -454,7 +462,11 @@ class WP_User {
 		else
 			$this->cap_key = $cap_key;
 
-		$this->caps = get_user_meta( $this->ID, $this->cap_key, true );
+		if ( null === $raw_caps ) {
+			$this->caps = get_user_meta( $this->ID, $this->cap_key, true );
+		} else {
+			$this->caps = $raw_caps;
+		}
 
 		if ( ! is_array( $this->caps ) )
 			$this->caps = array();
@@ -771,17 +783,19 @@ class WP_User {
 	 * Set the site to operate on. Defaults to the current site.
 	 *
 	 * @since 3.0.0
+	 * @since 4.6.0 Added `$raw_caps` parameter.
 	 *
 	 * @global wpdb $wpdb WordPress database abstraction object.
 	 *
-	 * @param int $blog_id Optional. Site ID, defaults to current site.
+	 * @param int   $blog_id  Optional. Site ID, defaults to current site.
+	 * @param array $raw_caps Optional. Array of site capabilities. If absent, will be fetched from usermeta.
 	 */
-	public function for_blog( $blog_id = '' ) {
+	public function for_blog( $blog_id = '', $raw_caps = '' ) {
 		global $wpdb;
 		if ( ! empty( $blog_id ) )
 			$cap_key = $wpdb->get_blog_prefix( $blog_id ) . 'capabilities';
 		else
 			$cap_key = '';
-		$this->_init_caps( $cap_key );
+		$this->_init_caps( $cap_key, $raw_caps );
 	}
 }
diff --git tests/phpunit/tests/user/query.php tests/phpunit/tests/user/query.php
index 7704344..59ae4ac 100644
--- tests/phpunit/tests/user/query.php
+++ tests/phpunit/tests/user/query.php
@@ -1196,4 +1196,26 @@ class Tests_User_Query extends WP_UnitTestCase {
 		$this->assertSame( $r1, $r2 );
 		$this->assertSame( $r1, $r3 );
 	}
+
+	/**
+	 * @ticket 36508
+	 */
+	public function test_fields_all_should_not_perform_separate_queries_for_role_data() {
+		global $wpdb;
+
+		$users = self::factory()->user->create_many( 4 );
+
+		$num_queries = $wpdb->num_queries;
+
+		$u = new WP_User_Query( array(
+			'fields' => 'all',
+			'include' => $users,
+			'count_total' => false,
+		) );
+
+		// user query + cap query = 2 queries.
+		$expected = $num_queries + 2;
+
+		$this->assertSame( $expected, $wpdb->num_queries );
+	}
 }
