Sub Process as the name suggests is a part of the main BPD, it has access to all the variables of the parent BPD without need for input/output bindings but can not be reused anywhere else, it can be used to create a structured design where in the higher level BPD can be simplified and with drill down still give the complete picture of the Entire Process.
A linked process on the other hand is a BPD itself which has been linked into a step of the calling BPD, input and output bindings are needed to transfer data between calling BPD and linked process, the can be reused across multiple BPDs and can be invoked directly also. You can dynamically call one of many linked process at runtime using a variable defined in the parent process.