Your approach will work. However, I would advise you to create a TEMP FUNCTION. In case you are going to use it a couple of times, it will make your code look better and easier to read.
The syntax would be as follows:
#standardSQL
CREATE TEMP FUNCTION NUMFORMAT(number FLOAT64) AS (
CONCAT(REGEXP_EXTRACT(cast(number as string), r'\d*\.\d{2}'), ' %')
);
SELECT
NUMFORMAT(888888.999),
NUMFORMAT(123456.99),
NUMFORMAT(74185.009),
NUMFORMAT(-10.789)
Notice that I am assuming the data you want to format as percentiles is a FLOAT64. Although, if it is not a FLOAT64 you can change that in the function. And the output is:

If your percentiles are too high, you may also want to format the integer part of the number. The syntax would be as follows:
#standardSQL
CREATE TEMP FUNCTION NUMFORMAT(number FLOAT64) AS (
#CONCAT(REPLACE(REPLACE(REGEXP_REPLACE(FORMAT("%'.2f", number), r'([\d,]+).(\d+)', r'\1=\2'), ',', '.'), '=', ','),'%')
#CONCAT(REGEXP_EXTRACT(cast(number as string), r'\d*\.\d{2}'), ' %')
CONCAT(format("%'.2f", cast(REGEXP_EXTRACT(cast(number as string), r'\d*\.\d{2}') as float64)), '%')
);
SELECT
NUMFORMAT(888888.999),
NUMFORMAT(123456.99),
NUMFORMAT(74185.009),
NUMFORMAT(-10.789)
The output would be:
