Why do some airports not have ICAO codes?
There is plenty of information on the Internet on how certain and specific identifiers came to life, however the codes are sometimes not directly assigned by ICAO, but by the member nations.


  ICAO Document 7910 - Location Identifiers contains codes allocated by national governments, on behalf of ICAO, to airports, airfields and other facilities such as ATC and weather stations. 


Ultimately, it is the national CAA's or other authorities' decision whether to assign a code and get it validated through ICAO. The decision may be based on political, historical or other reasons, there is no minimum requirements for airports to receive an ICAO code.




  Am I correct in assuming that airports without ICAO codes don't have codes because of the lack of a control tower? Or is there other reasons for this?


The availability of a control tower is not a requirement for ICAO codes, even small uncontrolled fields with grass strips can have an ICAO code, example: EDKW / Werdohl-Küntrop (600m grass / uncontrolled / PPR)