It's valid in the sense that you don't get any error. Whether they have an effect is another matter.
For most DMVs there is not really anything you can lock, since you are reading from internal structures in the engine, and they are anything but stable. If you join a couple of DMVs, the result you get may not be fully consistent, because things change while your query is running. And, of course, you don't want the entire server to stall when you run your diagnostic query.
When it comes to the catalog views, you are reading physical tables. However, the locks taken are not always the same as when you read normal tables. For instance, when you read a row in sys.objects, you are not taking a shared lock on that table, you take a schema-stability lock (Sch-S), and you take that lock, NOLOCK or not. Thus when reading catalog views, you can be blocked if there is a DDL transaction.
This also applies to some DMVs, for instance those that retrieve SQL text and query plans.