Column not like any value in column in other table - function
While your solution should basically do the job:

SELECT type FROM all_types WHERE type NOT LIKE ALL(SELECT type||'%' FROM completed_types)


Note some corner-case problems:


If completed_types.type isn't defined NOT NULL and you introduce even a single NULL, your query will not return any rows. So make sure it's NOT NULL.
If all_types.type allows NULL, those rows are never returned. So make sure that one is NOT NULL as well or adapt the query like below.
If one of the special characters %\_ is allowed, you may want to escape their special meaning when transforming the string to a LIKE pattern. See:


Escape function for regular expression or LIKE patterns



I suggest (using the simple function f_like_escape() outlined in the link above):

SELECT type
FROM   all_types a
WHERE  NOT EXISTS (
   SELECT FROM completed_types c
   WHERE  a.type LIKE f_like_escape(c.type) || %
   );


Also returns rows with all_types.type IS NULL - as opposed to your original.

Or save the readily escaped pattern as additional column in completed_types to avoid the escaping over and over.

Or, if completed_types.type always holds the leading 3 characters like your data sample suggests:

SELECT type
FROM   all_types a
WHERE  NOT EXISTS (
   SELECT FROM completed_types c
   WHERE  a.type = left(c.type, 3)
   );