Some chips use voltages outside of normal operating parameters for programming, either because the programming circuitry needs higher voltages than normal operation, or because such a design will avoid the possibility of having a part accidentally entering programming mode during operation. Such a design may make in-circuit programming difficult.
Some chips require the use of many pins for programming. To program an 18-pin PIC 16C54, for example, requires use of VDD and VSS (obviously), MCLR to engage programming mode (drive to 12 volts), all 12 I/O pins to input data, the RTCC pin to act as a read/write strobe, the clock input to advance addresses. The only pin not used for programming is the clock output. Programming such a device in-circuit would generally require disconnecting so many of its pins from other functions that it generally wouldn't be worth the effort.
At minimum, having a device support in-circuit programming generally requires at minimum that it include some way of isolating any internal programmable memory from whatever circuitry would normally try to use it. This need not be overly complicated, but may be difficult in devices which are trying to be as fast as possible during normal operation. In something like the PICC 16C54, the code store didn't need any special addressing circuitry for programming; instead, when MCLR was raised to 12 volts, that effectively forced the processor to execute NOP instructions, and so its program counter could be used to supply addresses. A switchable bidirectional path needed to be added between the I/O pins and the code-store data wires, but that wouldn't have to disable the normal paths taken by those signals (since the I/O pins default to floating, and the "force NOP" behavior (also used by skip instructions) meant that any code arriving at the instruction latch would be ignored. Allowing in-circuit programming would require that programming mode affect the functionality of more circuitry.