#1: You can't nest aggregates (as the error message clearly indicates), miles_per_month_q1 is an aggregated column and yu try to use it in another aggregate miles_per_month_num_records_outliers_lower_bound.

#2: You try to reuse a column alias miles_per_month_q1 within the calculation of miles_per_month_iqr, which is not allowed in Standard SQL.

For both cases you need to add another nesting level (i.e. Derived Table or Common Table Expression), in your case it's probably:

SELECT
a.model
, Count(DISTINCT reg_no) AS distinct_car_count
, Count(*) AS records_count
, Round(Avg(miles/age_months*1.0),2) AS miles_per_month_avg
-- now you can use the aliases, but you have to add a dummy (it's always the same value for a given model) aggregation function like MIN or MAX
, Min(percentiles.miles_per_month_med)
, Min(percentiles.miles_per_month_q1)
, Min(percentiles.miles_per_month_q3)
, Min(percentiles.miles_per_month_q3 - percentiles.miles_per_month_q1) AS miles_per_month_iqr
-- now it's no more nested aggregation
, Sum(CASE WHEN miles/age_months*1.0 < (percentiles.miles_per_month_q1 - 1.5* (percentiles.miles_per_month_q3 - percentiles.miles_per_month_q1)) THEN 1 ELSE 0 end) AS miles_per_month_num_records_outliers_lower_bound
, Sum(CASE WHEN miles/age_months*1.0 > (percentiles.miles_per_month_q3 + 1.5* (percentiles.miles_per_month_q3 - percentiles.miles_per_month_q1)) THEN 1 ELSE 0 end) AS miles_per_month_records_outliers_upper_bound
, Round(StdDev_Pop(miles/age_months*1.0),2) AS miles_per_month_stddev
FROM table1 a
JOIN
( -- calculate the nested aggregates first
SELECT
model
, Round(Percentile_Cont(0.5) Within GROUP (ORDER BY (miles/age_months*1.0) ASC),2) AS miles_per_month_med
, Round(Percentile_Cont(0.25) Within GROUP (ORDER BY (miles/age_months*1.0) ASC),2) AS miles_per_month_q1
, Round(Percentile_Cont(0.75) Within GROUP (ORDER BY (miles/age_months*1.0) ASC),2) AS miles_per_month_q3
FROM table1 a
GROUP BY model
) AS percentiles
ON a.model = percentiles.model
GROUP BY a.model