Since it is just a straight traversal no matter the depth, then you only need a single var block. This could be split into two var blocks but would make no difference.
Also it will provide better performance to put the eq and uid functions at the root of the blocks and move the type functions to the filter directive.
Your query was almost there and would work if you returned the wheels as the Truck.wheelTypes from the first var block and used them as the filter in the second block then returned bolts as WheelType.boltTypes from the second block and used them in the filter on the third block instead.
{
var(func: eq(Truck.name, "abc-truck")) @filter(type(Truck)) {
Truck.wheelTypes {
bolts as WheelType.boltTypes
}
}
query(func: uid(bolts)) @filter(type(BoltType)) {
uid
make
diameter
price
}
}