Since you are on SQL Server 2012 you can use a couple of the new windowing functions.

    with C1 as
    (
      select T.team_id,
             case
               when M.winning_team_id is null then 'T'
               when M.winning_team_id = T.team_id then 'W'
               else 'L'
            end as streak_type,
            M.match_id
      from FantasyMatches as M
        cross apply (values(M.home_fantasy_team_id),
                           (M.away_fantasy_team_id)) as T(team_id)
    ), C2 as
    (
      select C1.team_id,
             C1.streak_type,
             C1.match_id,
             lag(C1.streak_type, 1, C1.streak_type) 
               over(partition by C1.team_id 
                    order by C1.match_id desc) as lag_streak_type
      from C1
    ), C3 as
    (
      select C2.team_id,
             C2.streak_type,
             sum(case when C2.lag_streak_type = C2.streak_type then 0 else 1 end) 
               over(partition by C2.team_id 
                    order by C2.match_id desc rows unbounded preceding) as streak_sum
      from C2
    )
    select C3.team_id,
           C3.streak_type,
           count(*) as streak_count
    from C3
    where C3.streak_sum = 0
    group by C3.team_id,
             C3.streak_type
    order by C3.team_id;

[SQL Fiddle](http://www.sqlfiddle.com/#!6/c01c5/26)


`C1` calculates the `streak_type` for each team and match.

`C2` finds the previous `streak_type` ordered by `match_id desc`.

`C3` generates a running sum `streak_sum` ordered by `match_id desc` keeping a `0` a long as the `streak_type` is the same as the last value.

Main query sums up the streaks where `streak_sum` is `0`.