The bug
The way tellraw commands inherit properties is very inconsistent between formats. Here are some examples of tellraw commands:
{"text":"Hello","color":"red"}
Hello
{"text":"Hello","color":"red","extra":[{"text":" world"}]}
Hello world
{"text":" ","extra":[{"text":"How are you","color":"green"},{"text":" today?"}]}
How are you today
[{"text":"How are you","color":"green"},{"text":" today?"}]
How are you today
as you can see in the last two examples, putting your text objects in the extras array doesn't allow inheritance between them, however putting them in a first level array does. This makes no sense, because in both of these examples, the text snippets share the same relation, they are at the same level of an array, in the same order. They should behave the same.
Code analysis
Code analysis by @unknown can be found in this comment.
Linked issues
is duplicated by 2
Comments 11

Confirmed for 14w21b
Seems not intended, also it wasn't like this in earlier versions I think
But... WHAT is the bug? The first example, or the second one? Just a question... I'd like to know something about problem causing the tellraw generator inactive... :-/
Btw. you have two spaces in " today?".

The bug is that example 3 and 4 are different, I don't know what the intended functionality is, but it's inconsistent so that's a bug.

Best guess is the lack of direct parent for example 4, and the fact that the parent does not have any formatting available in example 3. The parent would be the very root of the JSON structure, thus "Test" in the following:
{text:"Test",color:"green",extra:["1", "2"]
In order for inheritance to work, there needs to be a parent, which is assigned in the root. Everything in the "extra" tag is considered the children of the root, and inherits all properties of the parent. However, if you use the following:
[{text:"Test",color:"green"},"2"]
We're are starting directly within the "extra" tag (using square brackets instead of curly), which causes a missing parent since the root is not defined by us. From my understanding, the very first item in the "extra" list will be designated the parent, and everything following it will be its children. That will force "Test" and "2" to be green, as you've observed.
An alternative solution to this would be to have an invisible parent that has no properties, but then you couldn't access the functionality of root inheritance which is too useful to give up. A quick way to overcome unwanted inheritance from starting within the "extra" tag is simply a blank record:
["",{text:"1",color:"green"},"2"]
And only "1" will be green.
Each of the items within the "extra" list will be the parent to its own "extra" tag:
["",{text:"1",color:"green",extra:["a"]},"2"]
"a" will inherit from its parent "1", becoming green. It will also inherit from the parent of "1" as well (referred to as "grandparent" from now on), though there is no formatting for it in the above example (it being the first list item, which is blank). The parent ("1") is considered closer to the child ("a") than the grandparent (""), so if both the parent and grandparent has a color defined, the child inherits from the parent and not the grandparent:
{text:"Test",color:"green",extra:[{text:"1",color:blue,extra:["a"]}]}
"Test" will be green, yet "1" and "a" will be blue. But if the grandparent has a property that the parent does not define, the child inherits it from the grandparent anyway:
{text:"Test",color:"green",underlined:"true",extra:[{text:"1",color:blue,extra:["a"]}]}
"Test" will be green and underlined, while "1" and "a" are blue and underlined.
Just to summarize: example 3 does have a root parent, but since there's no formatting, the children ("extra" tag) have nothing to inherit. Example 4 has no root parent whatsoever, so the first "extra" item will be assigned as the parent instead.
Though this is only best guess as to why inheritance appears inconsistent, not a confirmation. I'm also in a situation where I can't confirm all the examples above in-game, so I'm going off memory. Apologies if I've made any errors.

Confirmed for
1.8.4 but might be intended
@unknown seems to be pretty right, even
["",{text:1,color:green},{text:2}]
inherits from the empty text (the only exception seems to be the written book, see MC-78925)

Confirmed for
16w06a

Please link to this comment in the description of the report.
The following is based on decompiled version of Minecraft 1.8 using MCP. All method and class names are the names used in the decompiled version.
In case the inheritance from the left most entry if only a list is provided is a valid bug, the reason for this lies in the public IChatComponent deserialize(JsonElement p_deserialize_1_, Type p_deserialize_2_, JsonDeserializationContext p_deserialize_3_)
method of the net.minecraft.util.IChatComponent.Serializer
class. There it uses the first parsed chat component as parent.
public IChatComponent deserialize(JsonElement p_deserialize_1_, Type p_deserialize_2_, JsonDeserializationContext p_deserialize_3_)
{
if (p_deserialize_1_.isJsonPrimitive())
{
return new ChatComponentText(p_deserialize_1_.getAsString());
}
else if (!p_deserialize_1_.isJsonObject())
{
if (p_deserialize_1_.isJsonArray())
{
JsonArray var11 = p_deserialize_1_.getAsJsonArray();
// Replaced this
//IChatComponent var12 = null;
IChatComponent var12 = new ChatComponentText("");
Iterator var15 = var11.iterator();
while (var15.hasNext())
{
JsonElement var17 = (JsonElement)var15.next();
IChatComponent var18 = this.deserialize(var17, var17.getClass(), p_deserialize_3_);
// Replaced this
//if (var12 == null)
//{
// var12 = var18;
//}
//else
//{
// var12.appendSibling(var18);
//}
var12.appendSibling(var18);
}
return var12;
}
else
{
throw new JsonParseException("Don\'t know how to turn " + p_deserialize_1_.toString() + " into a Component");
}
}
else
{
//...
}
}
Confirmed for 1.13.1.
Can confirm in 20w51a.
Really good description, but sadly, can't confirm if a bug or intended.