Is it possible to output multidimensional data from linear table without iteration?
I think you just need include the month in the GROUP BY:

SELECT m.riderUid, w.firstName, w.lastName, w.isMale,
  MONTH(m.rideDate) as monthNumber,
  SUM(mileage) as miles, 
  COUNT(*) as cnt 
FROM `mileage` m 
    INNER JOIN `members` w ON (w.uid = m.riderUid) 
WHERE (m.rideDate &gt;= '$startDate' AND m.rideDate &lt; '$endDate') 
GROUP BY m.riderUid, w.firstName, w.lastName, w.isMale, MONTH(m.rideDate) 
ORDER BY MONTH(m.rideDate), m.riderUid


If the date range is longer than a year, then months from different years will be folded together, so replace MONTH(m.rideDate) with LEFT(m.rideDate, 7) as suggested by @RickJames. 

If you want the months as columns, then you need to "pivot" the months, see e.g. this answer on Stackoverflow. So that might give you a query with a subquery similar to the above, something like:

SELECT riderUID, firstName, lastName, isMale,
CASE WHEN monthNumber = 1 THEN miles END AS JanuaryMiles, 
CASE WHEN monthNumber = 1 THEN cnt END AS JanuaryCnt, 
CASE WHEN monthNumber = 2 THEN miles END AS FebruaryMiles, 
CASE WHEN monthNumber = 2 THEN cnt END AS FebruaryCnt,
CASE WHEN monthNumber = 3 THEN miles END AS MarchMiles, 
CASE WHEN monthNumber = 3 THEN cnt END AS MarchCnt,
CASE WHEN monthNumber = 4 THEN miles END AS AprilMiles, 
CASE WHEN monthNumber = 4 THEN cnt END AS AprilCnt,
CASE WHEN monthNumber = 5 THEN miles END AS MayMiles, 
CASE WHEN monthNumber = 5 THEN cnt END AS MayCnt,
CASE WHEN monthNumber = 6 THEN miles END AS JuneMiles, 
CASE WHEN monthNumber = 6 THEN cnt END AS JuneCnt,
CASE WHEN monthNumber = 7 THEN miles END AS JulyMiles, 
CASE WHEN monthNumber = 7 THEN cnt END AS JulyCnt,
CASE WHEN monthNumber = 8 THEN miles END AS AugustMiles, 
CASE WHEN monthNumber = 8 THEN cnt END AS AugustCnt,
CASE WHEN monthNumber = 9 THEN miles END AS SeptemberMiles, 
CASE WHEN monthNumber = 9 THEN cnt END AS SeptemberCnt,
CASE WHEN monthNumber = 10 THEN miles END AS OctoberMiles, 
CASE WHEN monthNumber = 10 THEN cnt END AS OctoberCnt,
CASE WHEN monthNumber = 11 THEN miles END NovemberMiles, 
CASE WHEN monthNumber = 11 THEN cnt END NovemberCnt, 
CASE WHEN monthNumber = 12 THEN miles END AS DecemberMiles, 
CASE WHEN monthNumber = 12 THEN cnt END AS DecemberCnt 
FROM (
    SELECT m.riderUid, w.firstName, w.lastName, w.isMale,
      MONTH(m.rideDate) as monthNumber,
      SUM(mileage) as miles, 
      COUNT(*) as cnt 
    FROM `mileage` m 
      INNER JOIN `members` w ON (w.uid = m.riderUid) 
    WHERE (m.rideDate &gt;= '$startDate' AND m.rideDate &lt; '$endDate') 
    GROUP BY m.riderUid, w.firstName, w.lastName, w.isMale, MONTH(m.rideDate) 
) q1
ORDER BY riderUid 


See here for db-fiddle example. Note: If running this query through phpMyAdmin, you may have to embrace each instance of CASE WHEN ... END in parentheses in order to workaround a bug in phpMyAdmin. 

(I suspect the above can also be re-written more elegantly without the subquey using window functions, though that requires MySQL 8.0+ or MariaDB 10.2+.) 

A couple of other tips: 


Include all the fields you SELECT in your GROUP BY - this is required by default in newer MySQL versions. 
Also, surely you can use INNER JOIN instead of OUTER JOIN in this case? Or do you have mileage for members who are no longer in the members table? If so, you may want to keep the LEFT JOIN.
Also, InnoDB is a better choice than MyISAM in most use-cases now, and MyISAM is discouraged in MySQL 8.0+.