You're right that efficiency is optional. I'm not sure where I got the idea that it was required.
I'm not a fan of using 0L as a color placeholder value; that's effectively like making it optional, but without the clarity. If the value's unknown, I'd rather know that it's unknown, if that makes sense. What happens if we make it optional? If the user wants to specify a grain for which color is the distinguishing feature, they're still able to do so.
Is the rationale to support automatic analysis? So that, say, your program could read any BeerXML2 file and output the expected color? There's something to be said for that, because the program doesn't have to do any manual verification -- if the file complies with the schema, you know it has all the required information. I'm wondering if it might make sense to define two variants? There could be a "Strict" or "Complete" which must provide all the information you could ask for, and a "Lax" in which only the bare minimum is required. Does that make sense, or is it just making extra work? It's hard to come up with a format that's equally appropriate for a beer program's database and a hand-entered note.
I'm not 100% sure I understand the "session record" idea, but I think I like it. Would that be a description of a specific brewing event, as distinct from the general instructions? I can picture including OG and FG measurements, temperature recordings, and notes at various stages. I'm not sure about things like substitutions -- maybe it should just be a different recipe in that case. That's a question of beer philosophy, I think. If the session records don't include substitutions, maybe the recipe should allow a way of specifying alternates? Many written recipes will say "Wyeast XXX or White Labs YYY" for example. I don't have any strong preferences on this.