Naively (following your "using enumeration" comment), computing $P(E=\text{true}| B=\text{true}, G=\text{true})$ requires evaluating your joint probability distribution at all values where $B$ and $G$ are true, which is $2^6$ lookups since you have to vary over all possible values of 6 boolean variables: $A, C, D, E, H, I$.
The most straightforward way to exploit conditional independence is to condition on more stuff to reduce the number of lookups. As you note, $E$ is independent of $A, C, D$ conditional on $B, G$, so we have
$$
P(e| b, g) = P(e| b, g, a, c, d)
$$
where you can take $a, c, d$ to be whatever constant values you like (e.g. all true). Here I'm using the shorthand "$c$" to mean "$C=c$", and similarly for the other letters. Naively evaluating the right hand side requires only $2^3$ lookups, since you only have to vary over possible values of $E, H, I$.
In this example you can do better because the conditional joint distribution $P(E, H, I| b,g,a,c,d)$ "inherits" a Bayes network structure which is a tree, so you can compute marginals with belief propagation:
$$
\boxed{E_{|B=b}} \to \boxed{H} \to \boxed{I_{|B=b, A=a}}
$$
In general you can't expect to get a polytree, but this trick of conditioning on all variables conditionally independent of the node of interest might still induce a simpler network where it's easier to compute marginals.
In this example, computing $P(E=\text{true}|A=\text{true}, I=\text{true})$ seems like it'd be pretty annoying.