You can, in principle, write loops to do this without allocations (if the destination is already allocated) but with nested broadcast, I think it is trickier.
Here is one way to do it:
julia> let ⋆(x, y) = x .* y
[[1], [2, 3]] .⋆ [[4], [5]]
end
2-element Array{Array{Int64,1},1}:
[4]
[10, 15]
You can also define ⋆(x, y)
globally if you need to use it everywhere.
See also: Idiomatic way to write element-wise combination of array of arrays?