CSSのセレクタは右から左に解釈されていくので、:not([style="display:none;"])のセレクタによって:last-of-childで指定している<li style='display:none;'>リスト5</li>が除外されています。
HTMLの方を<li>リスト5</li>とすると、:not([style="display:none;"])から外れてbackground-color:red;が適用されることを確認できるはずです。
個人的には:not([style="display:none;"])がそもそも不要なのではないかと思うのですが、どのような意図があるのか教えて下されば解決に繋がる回答を出せるかもしれません。
CSS
1ul li:last-of-type {
2  background-color: red;
3}
追記
すみません、質問を勘違いしていました。
<li>リスト3</li>にスタイルを当てたいと書いてありますね…。
追記
kei344さんが仰っているように、現状のCSSセレクタでは対応できません。
これに対応可能なJavaScriptを用意したので、よろしければ試してみてください。
確認しやすいようにHTMLごとコードを記載しておきます。
HTML
1<!DOCTYPE html>
2<html lang="ja">
3<head>
4<meta charset="utf-8">
5<title>example</title>
6<meta http-equiv="X-UA-Compatible" content="IE=edge">
7<meta name="viewport" content="width=device-width, initial-scale=1.0">
8<style type="text/css">
9.last-child {
10  background-color: red;
11}
12</style>
13<script type="text/javascript">
14;( function() {
15  // displayプロパティの値がnoneではない最後の子要素にクラスを追加する関数
16  function visible_last_child() {
17    // .visible-last を与えられた要素(ul)を取得
18    var elements = document.getElementsByClassName('visible-last');
19    // 要素(ul)の数を取得
20    var l = elements.length;
21    // for ループ処理用の変数を宣言
22    var element, children, c, child, target;
23
24    // .visible-last を与えられた要素(今回はul要素に指定)を個別に取得するためのループ
25    for (var i = 0; i < l; ++i) {
26      // 個別の要素(ul)を取得
27      element = elements[i];
28      // 子要素(li)を取得
29      children = element.children;
30      // 子要素(li)の数を取得
31      c = children.length;
32
33      // 子要素(li)を個別に取得するためのループ
34      for (var j = 0; j < c; ++j) {
35        // 子要素(li)を個別に取得
36        child = children[j];
37
38        // displayプロパティの値がnone以外の子要素を取得
39        if (child.style.display !== 'none') {
40          // 変数targetに子要素を代入
41          target = child;
42        }
43      }
44
45      // 変数targetに最後に代入された要素にクラスを追加
46      // 他のクラスがあるときはスペースを空けて.last-childを追加
47      if (target.className) {
48        target.className = target.className + ' last-child';
49
50      // 他にクラスがないときはそのまま.last-childを追加
51      } else {
52        target.className = 'last-child';
53      }
54    }
55  }
56
57  // DOMを読み込み終えたときにvisible_last_child()を実行
58  document.addEventListener('DOMContentLoaded', visible_last_child, false);
59}());
60</script>
61</head>
62<body>
63<!-- .visible-lastを追加した要素が対象になる -->
64<ul class="visible-last">
65  <li style="display:none;">リスト1</li>
66  <li>リスト2</li>
67  <li>リスト3</li><!-- displayプロパティの値がnoneである要素を除いた最後の要素に.last-childが追加される -->
68  <li style="display:none;">リスト4</li>
69  <li style="display:none;">リスト5</li>
70</ul>
71</body>
72</html>
ちなみに、このコードは動的な変化(display: none;を動的に付け外しするなど)には対応していないので、そのような動的な処理がある場合にはそちらにも同様の処理を追加する必要があることに注意してください。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/04/19 23:16