Try this...
declare @date datetime
set @date = round(cast(getdate() as float),0,1)
SELECT
A.a_id,
C.c_id,
B.b_id,
D.d_id,
E.e_id,
F.g_id
FROM table_G G
INNER JOIN
table_A A
ON A.a_id = G.a_id and a.Created < @date
INNER JOIN
table_C C
ON C.c_id = G.c_id
LEFT JOIN
table_B B
ON B.a_id = A.a_id
LEFT JOIN
table_D D
ON D.b_id = B.b_id AND D.c_id = G.c_id
LEFT JOIN
table_E E
ON E.e_id = COALESCE(D.e_id, C.e_id)
LEFT JOIN
table_F F
ON F.g_id = G.g_id
WHERE
F.g_id IS NULL
In general, it is better to put conditions (where possible) into inline views instead of the where clause. That way, the number of rows is determined before the potentially billions of other rows introduced by the joins are considered. Also, if you're computing a value, do it in a variable before you put it in a join - it's a kazillion times faster. Another good way would be
declare @date datetime
set @date = round(cast(getdate() as float),0,1)
SELECT
A.a_id,
C.c_id,
B.b_id,
D.d_id,
E.e_id,
F.g_id
FROM table_G G
INNER JOIN
(select * from table_A where created < @date) A
ON A.a_id = G.a_id
INNER JOIN
table_C C
ON C.c_id = G.c_id
LEFT JOIN
table_B B
ON B.a_id = A.a_id
LEFT JOIN
table_D D
ON D.b_id = B.b_id AND D.c_id = G.c_id
LEFT JOIN
table_E E
ON E.e_id = COALESCE(D.e_id, C.e_id)
LEFT JOIN
table_F F
ON F.g_id = G.g_id
WHERE
F.g_id IS NULL
if you don't like inline views.