Jim,
I've never had an issue with the Join Data Values Extension when scoped to any scope. It sounds like page.l2 is not defined in time when the Join Extension is scoped to All Tags.
When an extension is scoped to a specific tag it runs quite a bit later during page load then if it is scoped to All Tags.
One thing to check is when page.l2 is defined.
Is it getting defined in another extension? If so, is that extension above the Join extension in the list of extensions? What is the scope of the extension setting page.l2
You could scope the Join Data Values extension to All Tags. Then add a JS Code extension that outputs the "b" object in the console of Developer Tools to see what is available right before that extension runs.
Add this to a JS Code extension. Make sure the JS Code extension has the same scope (All Tags) as the Join Data Values extension, and make sure the JS Code extension is directly above the Join Data Values extension in the list of extensions.
Add this to the JS Code extension:
document.cookie="utagdb=true";
utag.DB("**** Data available for Join Data Values Extension *****");
utag.DB(b);
This will output all the data that is available when the Join Data Value Extension runs.