How to make a struct support subsetting elements 'recursively'

As one solution, you could override Base.getindex:

julia> import Base: getindex

julia> getindex(s::mystuff, i) = mystuff(s.x[i], s.y[i])
getindex (generic function with 545 methods)

julia> check = mystuff([1,2,3],[8,9,10])
mystuff([1.0, 2.0, 3.0], [8.0, 9.0, 10.0])

julia> check[1:2]
mystuff([1.0, 2.0], [8.0, 9.0])

This is a typical Julia pattern. Use the type system to create specific behavior and override Base or other functions (i.e. add new methods of those functions) locally to support your types.