You could use anonymous variables in a regular Julia Dict
:
julia> using JuMP
julia> m = Model();
julia> A = [(:a1,:b1),(:a2,:b2)];
julia> x = Dict((i, j) => @variable(m, basename = "x[$(string(i)),$(string(j))]") for (i, j) in A)
Dict{Tuple{Symbol,Symbol},JuMP.Variable} with 2 entries:
(:a2, :b2) => x[a2,b2]
(:a1, :b1) => x[a1,b1]
julia> x[:a1, :b1]
x[a1,b1]