Download is basically just map size. When you're making your version of your map to be played, delete anything custom that's not being used. This could include items, units, abilities, imports, triggers, variables, and anything else that's not being used.
When your game loads it creates all your custom objects, puts everything on the map that's there on initialization, and prepares any triggers you have running on initialization. Custom abilities with alot of levels will increase your load time. If you're using any abilities with more than 5 or 10 levels, you may want to rethink those ideas. Only run things that are absoluteley necessary on initialization like setting player teams, hero selection system, or anything else that could be fucked up by something a player does. Depending on what type of map you're making, alot of thing can be setup after initialization or you can make people wait for 30 seconds or so while your map sets up. You can run a cinimatic or just let players look over availables heros for 30 seconds or whatever floats your boat.
Preplaced heroes or heroes that are preloaded with your initialization trigger are gonna make your load longer, but they are also gonna lag in game the first time they come out. You'd just have to try it different ways and see what you're happy with.
This part's a little tricky and takes some time to see how it works for you. If you understand jass and have jasscraft or something similiar, you can look at your map's compiled script and see all the units being placed while your map loads. You can pretty much just copy that section into a trigger and run the whole thing after initialization. The only units that will need to be there are any units that are directly linked through triggers, such as "when u00047 dies- do something". You could change things like that to be based on unit type or use variables to get around things like that. It's probably gonna lag in game when you create all these things, but that depends on you map and how many custom things you're using. It's generally only gonna lag the first time it makes a custom object. So, if you happen to have alot of the same custom object on your map, you could just leave 1 there to be loaded with the map and place the rest later. That just takes some trial and error to see what you're happy with.
Not sure if any of this helps you, but these are some things I've experimented with while trying to improve load times.