Der TeX-Interpreter hat intern Hash-Tables, die er für den Lookup von definierten Makros benutzt.  Daher halte ich es für klug für jeden Eintrag in der Liste ein Makros zu definieren und beim holen des Werts zu prüfen, ob das Makro existiert.
existiert.  (Der ganze Spaß geht sogar [ohne e-TeX-Extensions](http://hastebin.com/yonaxojewo.tex))
Die Performance habe ich evaluiert, indem ich eine Liste angelegt habe in der Key=Value ist (zwar nutzlos, aber ein einfaches Beispiel).
    \documentclass{article}
    \usepackage{xparse}
    
    \ExplSyntaxOn
    
    \int_step_inline:nnnn { 1 } { 1 } { 5000 }
     { \cs_new:cpn { lookup_table_#1 } { #1 } }
    
    \NewDocumentCommand \Wertsuche {m}
     {
      #1:~
      \cs_if_exist:cTF { lookup_table_#1 }
       { \use:c { lookup_table_#1 } }
       { kein~Wert }
     }
    
    \ExplSyntaxOff
    
    \begin{document}
    \Wertsuche{500}
    \end{document}
Der LaTeX-Aufruf dauert
    $ time pdflatex test.tex
    real    0m0.321s
    user    0m0.300s
    sys     0m0.016s
Dasselbe mit Clemens' Lösung:
    \documentclass{article}
    \usepackage{expl3,xparse}
    
    \ExplSyntaxOn
    \tl_new:N \l_meinmodul_tmpa_tl
    
    \prop_new:N \l_meinmodul_liste_prop
    \int_step_inline:nnnn { 1 } { 1 } { 5000 }
     { \prop_put:Nnn \l_meinmodul_liste_prop { #1 } { #1 } }
    
    \cs_new_protected:Npn \meinmodul_wertsuche:n #1
      {
        \prop_get:NnNTF \l_meinmodul_liste_prop {#1} \l_meinmodul_tmpa_tl
          { \tl_use:N \l_meinmodul_tmpa_tl }
          {kein~ Wert}
      }
    
    \NewDocumentCommand \Wertsuche {m}
      { #1:~ \meinmodul_wertsuche:n {#1} }
    
    \ExplSyntaxOff
    
    \begin{document}
    \Wertsuche{500}
    \end{document}
Hier dauert es
    $ time pdflatex test.tex
    real    0m5.964s
    user    0m5.920s
    sys     0m0.016s