Casting an array of texts to an array of UUIDs
Like has been commented, the column project_ids should be uuid[], which would preclude the problem. It would also be more efficient.
To change (with no illegal data in column like you asserted):
ALTER TABLE users ALTER COLUMN project_ids DROP DEFAULT;

ALTER TABLE users
ALTER COLUMN project_ids SET DATA TYPE uuid[] USING project_ids::uuid[];

You had uuid instead of uuid[] by mistake.
And this:

ERROR: default for column &quot;product_ids&quot; cannot be cast automatically to type uuid[]


.. means you have a default value set for the column. That expression cannot be transformed automatically. Remove it before altering the type. You can add a new DEFAULT later.
Fix to original problem
The efficient fix in your original situation is to remove empty strings from the array with array_remove() before the cast (requires Postgres 9.3+):
SELECT *
FROM   users    u
JOIN   projects p ON p.id = ANY(array_remove(u.project_ids, '')::uuid[]);

... after investigating why there can be empty stings in that text[] column.
Related:

Delete array element by index
Would index lookup be noticeably faster with char vs varchar when all values are 36 chars

Fine points

The [INNER] JOIN in your query removes users without valid projects in projects_ids from the result. Typically, you'd want to keep those, too: use LEFT [OUTER] JOIN instead (with users first).

The JOIN folds duplicate entries either way, which may or may not be as desired. If you want to represent duplicate entries, unnest before the join instead.


And if your aim is simply to resolve the array of IDs to an array of project names, you'll also want to preserve original order of array elements:
SELECT *
FROM   users u
LEFT   JOIN LATERAL (
   SELECT ARRAY(
      SELECT project_name  -- use the actual column(s) of your case
      FROM   unnest (array_remove(u.project_ids, '')::uuid[]) WITH ORDINALITY AS p(id, ord)
      JOIN   projects USING (id)
      ORDER  BY ord
      )
   ) p(projects) ON true;

db&lt;&gt;fiddle here (loosely based on McNets' fiddle)
Related:

How to preserve the original order of elements in an unnested array?