Max of a query which is inside
Just a heads up that you can't use aggregate functions (like MAX()) in a WHERE clause, rather that's the purpose of the HAVING clause. But instead of using an aggregate function, a window function like DENSE_RANK() simplifies the solution you're looking for, like so:
CREATE VIEW FavoriteDroneManufacturers AS

SELECT s.[name]
FROM
(
    SELECT dman.[name], DENSE_RANK() OVER (ORDER BY COUNT(1) DESC) AS DroneCountRankId
    FROM Drones d
    INNER JOIN DroneModels dm
        ON d.model_id = dm.id
    INNER JOIN DroneManufacturers dman
        ON dm.id = dman.id
    GROUP BY dman.id, dman.[name]
) AS s
WHERE s.DroneCountRankId = 1

(Note the above uses a subquery since you were weary of using CTEs, but the logic inside the subquery could've just as equally been created in a CTE instead, and a View can equivalently be created on both either way.)
DENSE_RANK() generates an ID for each row ordered by the logic you specify in the ORDER BY clause. When there are two rows that tie for ordering (based on the logic specified) then the same ID will be generated for both.
In the above query, I'm ordering (by descending) on the grouped COUNT() of drones for each manufacturer, and when two manufacturers share the same COUNT() of drones, then they get the same DroneCountRankId. In the outer query, I filter on DroneCountRankId = 1 to give us only the manufacturer(s) with the max number of drones (if it's two manufacturers like in your example, then they are both returned this way). (If you changed the WHERE clause to DroneCountRankId = 2 then you'd get all manufacturer(s) with the top 2 number of drones, etc.)
I highly recommend reading up on window functions and the DENSE_RANK() function in particular, via the links I provided above.